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)的