Gab*_*ant 5 javascript arrays iteration loops
我正在尝试编写一个相当简单的Javascript函数,并且在迭代函数时遇到我不理解的行为.
我已将问题归结为以下情况.我想编写一个函数,将一个由数组数组组成的数组作为输入,例如A = [[[1]]].我不知道这个的标准术语,所以我将主数组称为"级别0",其中元素是"级别1"的数组.我会说1级数组由"2级"数组组成.2级数组由整数组成.
该函数在输入A(0级数组)上执行以下操作:
L;M中A
M;M,以LL.这是我的代码:
function myFunc(A){
var L = [];
for(var a=0; a<A.length; a++){
var M = A[a].slice(0);
for(var i=0; i<M.length; i++){
for(var j=0; j<M[i].length; j++){
M[i][j]++;
}
}
for(var s=0; s<2; s++){
var N = M.slice(0);
L.push(N);
}
}
return(L);
}
Run Code Online (Sandbox Code Playgroud)
现在我测试一下:
var A = [[[1]]];
A = myFunc(A)
Run Code Online (Sandbox Code Playgroud)
在此之后,我得到了A = [[[2]],[[2]]],这是我所期待的.但是,假设我迭代它:
var A = [[[1]]];
A = myFunc(A);
A = myFunc(A);
Run Code Online (Sandbox Code Playgroud)
然后我希望获得A = [[[3]],[[3]],[[3]],[[3]]],但相反,我有A = [[[4]],[[4]],[[4]],[[4]]].
另一方面,如果我跑myFunc([[[2]],[[2]]]),我确实得到了预期[[[3]],[[3]],[[3]],[[3]]].
我不明白这种差异来自何处.
问题是这条线:
M[i][j]++;
Run Code Online (Sandbox Code Playgroud)
Node将此作为对A切片的引用,当您执行此操作时,您会清楚地看到它:
x = [[[1]]];
myFunc(x);
myFunc(x);
console.log(x); // ---> [[[3]]]
Run Code Online (Sandbox Code Playgroud)
对于浅拷贝,你必须使用这个JSON.parse(JSON.stringify())技巧,并证明M是问题; 在M = A[a].slice(0);解决问题后添加此行.
M = JSON.parse(JSON.stringify(M))
Run Code Online (Sandbox Code Playgroud)
Mozilla的文档Array.prototype.slice():
对于对象引用(而不是实际对象),slice将对象引用复制到新数组中.原始数组和新数组都引用相同的对象.如果引用的对象发生更改,则更改对新的和原始数组都可见.
这就是为什么,因为当你这样做时M[i][j],更深层次的数组仍在外面引用.
| 归档时间: |
|
| 查看次数: |
763 次 |
| 最近记录: |