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
相关产品推荐
相关产品推荐

