JavaScript推送未推送正确的值
代码如下:JavaScript推送未推送正确的值,javascript,arrays,Javascript,Arrays,代码如下: 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].answe
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);
但是
stronglyAgree
中的最后一个数组是[72,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]
您可能希望在更改值之前创建不同的数组
您可以使用,也可以动态创建一个数组。您正在使用相同的引用并对其进行更改:
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]
您可能希望在更改值之前创建不同的数组
您可以使用它,也可以动态创建一个数组。这是因为您将引用推送到tempArray而不是副本。尝试:
stronglyAgree.push(tempArray.slice());
这是因为您将引用推送到tempArray而不是副本。尝试:
stronglyAgree.push(tempArray.slice());
当您将某个内容分配给数组时,如下所示
tempArray[1] = ...
stronglyAgree.push(tempArray.slice());
...
agree.push(tempArray.slice());
...
disagree.push(tempArray.slice());
...
stronglyDisagree.push(tempArray.slice());
...
na.push(tempArray.slice());
实际上,您正在对数组对象进行变异。所以,无论你对它进行多少次变异,它都是同一个对象
当你这么做的时候
stronglyAgree.push(tempArray);
...
agree.push(tempArray);
...
disagree.push(tempArray);
...
stronglyDisagree.push(tempArray);
...
na.push(tempArray);
您正在将对同一阵列对象的引用推送到所有其他阵列对象。相反,每次推送时都要创建一个新的数组对象,如下所示
tempArray[1] = ...
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对象突变,那么这些变化仍然会反映在其他数组对象中。当您为数组分配某个对象时,如下图所示
tempArray[1] = ...
stronglyAgree.push(tempArray.slice());
...
agree.push(tempArray.slice());
...
disagree.push(tempArray.slice());
...
stronglyDisagree.push(tempArray.slice());
...
na.push(tempArray.slice());
实际上,您正在对数组对象进行变异。所以,无论你对它进行多少次变异,它都是同一个对象
当你这么做的时候
stronglyAgree.push(tempArray);
...
agree.push(tempArray);
...
disagree.push(tempArray);
...
stronglyDisagree.push(tempArray);
...
na.push(tempArray);
您正在将对同一阵列对象的引用推送到所有其他阵列对象。相反,每次推送时都要创建一个新的数组对象,如下所示
tempArray[1] = ...
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对象发生了变化,那么这些变化仍然会反映在其他数组对象中。所有数组都有相同的内容:tempArray
。您多次更改tempArray
的内容,但当您更改它时,它会在所有其他数组中更改。每次在下一次推送之前,您都需要克隆tempArray
,以便它停止共享值;在JavaScript中,您可以使用tempArray=tempArray.slice(0)
来执行此操作。所有数组都具有相同的内容:tempArray
。您多次更改tempArray
的内容,但当您更改它时,它会在所有其他数组中更改。每次在下一次推送之前,您都需要克隆tempArray
,以便它停止共享值;在JavaScript中,您可以使用tempArray=tempArray.slice(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
]);
}
for(var i=0;i基本问题是在每次循环迭代中只创建一个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
]);
}
(变量i=0;i)的