JavaScript推送不推送正确的值

时间:2015-01-11 15:48:58

标签: 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].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}},这对我来说似乎并不合适。我在这里做错了什么?

5 个答案:

答案 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。