• 5
  • 新人请关照

这样的排序方法有毛病吗?

// 打乱数组
function shuffle(data){
    let startIndex = 0,
        endIndex = length = data.length - 1;
    while(endIndex){
        let index = Math.floor(Math.random()*length);
        [data[index], data[endIndex]] = [data[endIndex], data[index]];
        endIndex--;
    }
}

// 具有负数或重复值的数据除外,使用这种方式似乎比其他排序更快一些。
var obj = {};
var arr = Array.from({length:1e5},(item,index)=>index);

shuffle(arr);
console.time();
arr.forEach(item => { obj[item] = item });
console.log(Object.values(obj));
console.timeEnd();
阅读 146
评论
    2 个回答
    • 12.2k

    没什么毛病,就是洗牌算法,不过洗牌算法乘以length会有重复的洗牌过程,所以可以直接

    let index = Math.floor(Math.random()*endIndex);
      • 2.9k

      Object.values - MDN

      **Object.values()**方法返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用for...in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。

      然后 for...in 里面说

      for...in语句以任意顺序遍历一个对象的除Symbol以外的可枚举属性。

      任意顺序,任意顺序,任意顺序


      不要依赖 Object 转数组的顺序啊。用来遍历可以,用来排序就算了

        撰写回答

        登录后参与交流、获取后续更新提醒