以下是代码:
var stronglyAgree = [];
var agree = [];
var disagree = [];
var stronglyDisagree = [];
var na = [];
for (var i=0; i<survey.questions.length; i++) {
var tempArray = [];
tempArray[0] = i*8;
tempArray[1] = survey.questions[i].answers[0].count;
stronglyAgree.push(tempArray);
console.log(tempArray);
tempArray[1] = survey.questions[i].answers[1].count;
agree.push(tempArray);
tempArray[1] = survey.questions[i].answers[2].count;
disagree.push(tempArray);
tempArray[1] = survey.questions[i].answers[3].count;
stronglyDisagree.push(tempArray);
tempArray[1] = survey.questions[i].answers[4].count;
na.push(tempArray);
}
console.log(stronglyAgree);
正如您所看到的,我正在记录tempArray
,而stronglyAgree
正被推送到`tempArray = [72,1]`
。谈到最后一个问题,例如,我得到:
stronglyAgree
但[72,0]
中的最后一个数组是{{1}},这对我来说似乎并不合适。我在这里做错了什么?
答案 0 :(得分:4)
为数组分配内容时,例如
tempArray[1] = ...
你实际上正在改变数组对象。所以,无论你多少次改变它,它都是同一个对象。
当你这样做时,
stronglyAgree.push(tempArray);
...
agree.push(tempArray);
...
disagree.push(tempArray);
...
stronglyDisagree.push(tempArray);
...
na.push(tempArray);
您正在将对同一数组对象的引用推送到所有其他数组对象。相反,每当你推动时都要创建一个新的数组对象,比如
stronglyAgree.push(tempArray.slice());
...
agree.push(tempArray.slice());
...
disagree.push(tempArray.slice());
...
stronglyDisagree.push(tempArray.slice());
...
na.push(tempArray.slice());
现在,每次调用slice
时都会创建一个数组副本,对tempArray
的更改不会再影响其他数组中的数组。
注意: slice
创建的数组对象是浅复制数组。因此,如果tempArray
具有可变对象,并且使用slice
d对象进行了变异,则更改仍会反映在其他数组对象中。
答案 1 :(得分:0)
您正在使用相同的参考并进行更改:
var arrA = [];
var arrB = [];
var tempArray = [];
tempArray[0] = 10;
tempArray[1] = 7;
arrA.push(tempArray);
tempArray[1] = 8;
arrB.push(tempArray);
console.log(arrA); // [10,8]
console.log(arrB); // [10,8]
您可能希望在更改值之前创建不同的数组。
你可以使用Array.prototype.slice()
或者只是动态创建一个数组。
答案 2 :(得分:0)
这是因为你推送对tempArray的引用而不是副本。尝试:
stronglyAgree.push(tempArray.slice());
答案 3 :(得分:0)
您的所有阵列都具有相同的内容:tempArray
。您多次更改tempArray
的内容,但在更改内容时,它会在所有其他数组中更改。您需要在下次推送之前每次克隆tempArray
,以便停止共享值;在JavaScript中,您可以使用tempArray = tempArray.slice(0)
。
答案 4 :(得分:0)
基本问题是,您只在每次循环迭代中创建一个 tempArray
,并修改其内容。因此,您推送它的所有数组都会引用相同的 tempArray
,并为您分配了最终的内容。
对于这么简单的事情,我根本不打算使用tempArray
:
for (var i=0; i<survey.questions.length; i++) {
var i8 = i * 8;
stronglyAgree.push([
i8,
survey.questions[i].answers[0].count
]);
agree.push([
i8,
survey.questions[i].answers[1].count
]);
disagree.push([
i8,
survey.questions[i].answers[2].count
]);
stronglyDisagree.push([
i8,
survey.questions[i].answers[3].count
]);
na.push([
i8,
survey.questions[i].answers[4].count
]);
}
如果你真的想将一堆数组推入你的stronglyAgree
数组等等,这看起来有点奇怪,特别是如果所有数组中的第一个条目都是i
乘以8。