【发布时间】:2015-06-18 02:43:55
【问题描述】:
我正在尝试编写一个相当简单的 Javascript 函数,但在迭代该函数时遇到了我不理解的行为。
我已将问题归结为以下情况。我想编写一个函数,它将一个由数组数组组成的数组作为输入,例如A = [[[1]]]。我不知道这方面的标准术语,所以我将把主数组称为“0 级”,它的元素是“1 级”的数组。我会说 1 级数组由“2 级”数组组成。 2 级数组由整数组成。
函数在输入A(0 级数组)上执行以下操作:
- 创建一个空数组
L; - 对于
A中的每个级别 1 数组M- 为
M中每个2 级数组中的每个整数条目加一; - 将
M的两个副本添加到L
- 为
- 返回
L。
这是我的代码:
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);
}
现在我测试一下:
var A = [[[1]]];
A = myFunc(A)
在这之后,我得到了A = [[[2]],[[2]]],这是我所期望的。但是,假设我迭代它:
var A = [[[1]]];
A = myFunc(A);
A = myFunc(A);
然后我希望获得A = [[[3]],[[3]],[[3]],[[3]]],但我却获得了A = [[[4]],[[4]],[[4]],[[4]]]。
另一方面,如果我运行myFunc([[[2]],[[2]]]),我会得到预期的[[[3]],[[3]],[[3]],[[3]]]。
我不明白这种差异来自哪里。
【问题讨论】:
-
这不是问题。两次调用的函数没有相同的结果,再次阅读他的问题。我正在调查,我认为有线索
-
它可能是引用值而不是复制值。在 A = myFunct(A) 调用之间尝试 A = JSON.parse(JSON.stringify(A)) 。我无法测试我在 iPhone 上
-
@FlavienVolken 是的,确实可以解决它,但我不明白为什么它在这里失败了。 :o
-
仍在挖掘,发现奇怪的行为,执行
x = [[[1]]],然后多次调用myFunc(x)。 -
我认为这个问题与 var M = A[a].slice(0) 有关。由于它是一个多维数组,因此它获取对原始 A 数组的引用。然后,当您增加 M[i][j]++ 时,它会改变 A。与@TristanFoureur 在他的答案中发现的相同:)
标签: javascript arrays loops iteration