You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript如何基于初始数组生成两个不同的乱序数组且原数组不变

问题根因

你当前使用的Fisher-Yates洗牌算法为原地修改实现:

  • 函数执行时会直接修改传入的原数组,不符合原数组不可修改的需求
  • 函数返回值为原数组的引用,两次调用后array1和array2指向同一个内存地址,所以打印结果完全一致
解决方法

修改洗牌函数,先对传入的原数组做浅拷贝,再对拷贝后的独立数组执行打乱操作,即可同时满足「原数组不变」「两次乱序结果独立」的需求。

修改后的完整代码如下:

const array = [
  {
    name: "Nick",
    age: 15,
    grade: 18
  },
  {
    name: "John",
    age: 16,
    grade: 15
  },
  {
    name: "Patrick",
    age: 13,
    grade: 11
  },
  {
    name: "George",
    age: 15,
    grade: 19
  }
];

console.log(array);

function shuffle(array) {
  // 浅拷贝原数组,不修改原始数据
  const shuffledArray = [...array];
  let currentIndex = shuffledArray.length,  randomIndex;

  while (currentIndex != 0) {
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex--;

    [shuffledArray[currentIndex], shuffledArray[randomIndex]] = [
      shuffledArray[randomIndex], shuffledArray[currentIndex]
    ];
  }

  return shuffledArray;
}

let array1 = shuffle(array);
console.log(array1);

let array2 = shuffle(array);
console.log(array2);
补充说明
  • 示例中使用展开运算符[...array]做浅拷贝,适合当前数组元素为引用类型、且不需要修改元素内部属性的场景。如果后续需要修改乱序后数组内的对象属性且不影响原数组,可以替换为深拷贝实现。
  • 每次调用shuffle都会生成独立的新数组,两次打乱操作互不干扰,最终得到的array1和array2为两个完全独立的乱序结果。

内容的提问来源于stack exchange,提问作者akis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:24:00