javascript - Javascript:将数组添加到二维数组时出现问题
问题描述
我正在尝试对数组进行洗牌,并每次使用循环将洗牌集添加到二维数组中。问题是生成的二维数组包含所有行的相同洗牌集,而每个洗牌集的输出不同。
所以; 我在这里想念什么?
var b=[1,2,3,4,5,6,7,8,9];
var matrix=[];
for(var i=0; i <5; i ++){
shuffle(b);
matrix[i]=b;
//matrix.push(b);
console.log(b);
}
console.log(matrix);
function shuffle(array) {
var ctr = array.length, temp, index;
while (ctr > 0) {
index = Math.floor(Math.random() * ctr);
ctr--;
temp = array[ctr];
array[ctr] = array[index];
array[index] = temp;
}
return array;
}
输出:
Array(9) [ 7, 3, 4, 9, 2, 1, 6, 8, 5 ]
Array(9) [ 5, 6, 3, 9, 8, 4, 1, 7, 2 ]
Array(9) [ 9, 5, 2, 4, 3, 6, 8, 7, 1 ]
Array(9) [ 3, 5, 2, 1, 4, 9, 6, 8, 7 ]
Array(9) [ 5, 9, 4, 6, 7, 3, 2, 8, 1 ]
(5) […]
0: Array(9) [ 5, 9, 4, … ]
1: Array(9) [ 5, 9, 4, … ]
2: Array(9) [ 5, 9, 4, … ]
3: Array(9) [ 5, 9, 4, … ]
4: Array(9) [ 5, 9, 4, … ]
length: 5
解决方案
您只有一个一维数组对象,即b
. 并且您不断改组并将相同的对象引用添加到matrix
:
matrix[i]=b;
因此,即使您添加了这样的行,当您shuffle
再次调用时,您仍将继续改变添加的行。
您应该获取数组的副本,以便将不同的数组添加到matrix
:
matrix[i]=b.slice();
有几种获取副本的方法:b.slice()
也可以是Array.from(b)
或[...b]
。
或者,您可以将b
作为新数组的初始化放在循环内:
var matrix = [];
for (var i = 0; i < 5; i++){
var b = [1,2,3,4,5,6,7,8,9];
shuffle(b);
matrix[i] = b;
}
由于您还设计shuffle
了返回数组,因此您可以将上述代码简化为:
var matrix = [];
for(var i = 0; i < 5; i++){
matrix[i] = shuffle([1,2,3,4,5,6,7,8,9]);
}
推荐阅读
- javascript - 如何在 Javascript 中正确设置 Cassandra 客户端?
- python - Python import Pillow/PIL 错误,不能 ImportError: cannot import name '_imaging'
- html - 为什么有这么多的文本从 flexbox 对齐的内容中溢出?
- html - 如何使用 R 从 url 列表中抓取新闻故事?
- tree - ZingChart 树模块中的控制工具提示和节点颜色
- android-studio - Android将ImageView中的图像设置为底部中心
- java - 使用从蓝牙模块读取的数据更新 TextView
- python - 将 DataFrame 保存到 csv 遇到错误“ImportError: cannot import name 'StringIO'”
- asp.net-mvc-5 - 如何在 ASP.NET MVC 5 中启用捆绑
- python-3.x - Tkinter如何制作计算器功能?