如何在 javascript 中随机排列对象数组?

新手上路,请多包涵

下面的代码适用于普通数组但不适用于带有对象的数组有人知道如何做到这一点吗?

 const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

function shuffle(array) {
  for (let i = array.length - 1; i > 0; i--) {
    let j = Math.floor(Math.random() * (i + 1));
    let temp = array[i];
    array[i] = array[j];
    array[j] = temp;
  }
  return array;
}

const result = shuffle(array);

console.log(JSON.stringify(result));

原文由 Arne 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 223
1 个回答

尝试像这样的片段排序:

 console.log( [
    { some: 1 },
    { some: 2 },
    { some: 3 },
    { some: 4 },
    { some: 5 },
    { some: 6 },
    { some: 7 },
  ]
  .sort( () => Math.random() - 0.5) );

回应 Martin Omanders 的评论:这是根据 Fisher-Yates 算法的 洗牌方法

 const result = document.querySelector("pre");
for (let i=0; i<20; i+=1) {
  result.textContent +=
    JSON.stringify(shuffleFisherYates([0,1,2,3,4,5,6,7,8,9])) + '\n';
}

function shuffleFisherYates(array) {
  let i = array.length;
  while (i--) {
    const ri = Math.floor(Math.random() * i);
    [array[i], array[ri]] = [array[ri], array[i]];
  }
  return array;
}
 <pre></pre>

这可能会被压缩为一个衬里( 注意:这个衬里不会在高级级别的 Google Closure 编译器 中编译):

 const shuffle = array =>
  [...Array(array.length)]
    .map((el, i) => Math.floor(Math.random() * i))
    .reduce( (a, rv, i) => ([a[i], a[rv]] = [a[rv], a[i]]) && a, array);
const result = document.querySelector("pre");
for (let i=0; i<100; i+=1)
  result.textContent +=
   JSON.stringify(shuffle([0,1,2,3,4,5,6,7,8,9])) + '\n';
 <pre></pre>

原文由 KooiInc 发布,翻译遵循 CC BY-SA 4.0 许可协议

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