这种多维数组怎么打乱输出是空呀?

在开发里遇到一个问题,请求回来的数据长这样

clipboard.png

用百度过的两个方法都没法打乱:

1、

return Math.random() > .5 ? -1 : 1;

输出为空

2、

for (let i = 1; i < this.data.bank.length; i++) {
const random = Math.floor(Math.random() * (i + 1));
[this.data.bank[i], this.data.bank[random]] = [this.data.bank[random], this.data.bank[i]];
}
console.log(this.data.bank)

输出为空,是我用的方法错了吗?

clipboard.png

!
clipboard.png

阅读 1.9k
2 个回答

好了,原来要在请求到的回调里,把数组先打乱再setData:

let query = new wx.BaaS.Query()
    let Product = new wx.BaaS.TableObject(56136)
    Product.find().then(res => {
      res.data.objects.sort((a, b) => {
        return (Math.random() - .5) > 0 ? -1 : 1;
      });
      this.setData({
        bank: res.data.objects
      })
      this.setData({
        show: this.showlistID(0, this.data.bank.length - 1)
      })
      console.log(this.data.bank)


    }, err => {
      // err
    })
a = [1,2,3,4,5]
(5) [1, 2, 3, 4, 5]
a.sort(function(a,b){return Math.random()>0.5?1:-1})
(5) [3, 2, 1, 4, 5]

他不会生成新的数组,而是会改变原来的数据.
稍微解释一下这个代码,sort方法接收的这个参数是一个函数,这个函数的功能是,判断传进来两个对象的大小,以此分别对比数组中的元素,来进行排序.如果a>b, 返回一个正数,否则返回一个负数,相等返回0.
而这里通过生成0到1的随机数并和0.5比较的方法,随机返回a和b的大小,根据这个大小关系排的顺序自然就是无法预料的,随机的了.这个实现有一些取巧.

你贴的第二种方法,其实和这个思路是一样的,把索引为i的项和一个随机项交换位置,每一项都操作一次.这个同样是在原来的数据上进行修改的.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题