我有一个像这样的多维数组:
var map = [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]];
然后我有一些函数可以在两个维度中“调整”数组,具体取决于某些变量。我就是这样做的:
function resizeArr(arr, rows, rowsDiff, cols, colsDiff) {
var arrLength = arr.length;
if (colsDiff > 0) {
i=0;
while (i<arrLength) {
j=0;
while (j<colsDiff) {
arr[i].push(0);
j++
}
i++
}
}
if (colsDiff < 0) {
i=0;
while (i<arrLength) {
j=0;
colsDiffAbs = Math.abs(colsDiff);
while (j<colsDiffAbs) {
arr[i].pop();
j++
}
i++
}
}
if (rowsDiff > 0) {
fullColsArr = makeArrayOf(0, cols);
i=0;
while (i<rowsDiff) {
arr.push(fullColsArr);
i++
}
}
if (rowsDiff < 0) {
rowsDiffAbs = Math.abs(rowsDiff);
i=0;
while (i<rowsDiffAbs) {
arr.pop();
i++
}
}
return arr;
}
基本上,使用这4个if语句,我会弹出一些值或推送一些新值(零),具体取决于rowsDiff / colsDiff变量是正数还是负数。
我的问题是当我从最大的地图[4] [4]调整数组到地图[9] [9]时,看起来一切都没问题,因为我得到了:
[[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0]]
作为我的新阵列,看起来不错。但是,当我尝试为map [9] [9]分配一个特定值时,它会填充每个新数组的最后一个值,如下所示:
[[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,14],[0,0,0,0,0,0,0,0,0,14],[0,0,0,0,0,0,0,0,0,14],[0,0,0,0,0,0,0,0,0,14],[0,0,0,0,0,0,0,0,0,14]]
如果我尝试为倒数第二个值(map [9] [8])指定一个值,它也会填充所有其他值的倒数第二个值。
但是当我为数组的原始部分赋值时,它可以正常工作。 我在这里做错了什么?
我试图尽我所能解释它 - 随时可以询问更多细节。
答案 0 :(得分:4)
按行扩展时,您会多次按相同的数组。因此,数组的每个新行只是指向相同的位置(相同的列数组)。因此,当你改变一个时,他们“全部”似乎都会改变。
相反,您希望为每个新行创建一个新数组并推送:
if (rowsDiff > 0) {
i=0;
while (i<rowsDiff) {
arr.push(makeArrayOf(0, cols));
i++
}
}