不能遍历数组并在JS中更改值

时间:2014-10-17 19:00:33

标签: javascript arrays iteration

我必须迭代一个数组,更改其中一个值,然后创建另一个数组来反映这些更改。

这是我到目前为止所做的:

JS:

var arr = new Array();

        arr['t1'] = "sdfsdf";
        arr['t2'] = "sdfsdf";
        arr['t3'] = "sdfsdf";
        arr['t4'] = "sdfsdf";
        arr['t5'] = "sdfsdf";

        var last = new Array();

        for (var i = 0; i <= 5; i++) {
            arr['t2'] = i;
            last.push(arr);
        }

        console.log(last);

不幸的是,这些是我的结果

enter image description here

正如你所看到的,我没有得到所需的结果为0,1,2 ..而是我得到2,2,2 .. 这就是我希望我的结果:

enter image description here

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

您必须制作副本,否则您始终在处理对同一对象的引用。正如之前所说 - javascript没有关联数组,只有具有属性的对象。

var arr = {}; // empty object

arr['t1'] = "sdfsdf";
arr['t2'] = "sdfsdf";
arr['t3'] = "sdfsdf";
arr['t4'] = "sdfsdf";
arr['t5'] = "sdfsdf";

var last = new Array();

for (var i = 0; i <= 5; i++) {
   var copy = JSON.parse(JSON.stringify(arr)); //create a copy, one of the ways
   copy['t2'] = i;  // set value of its element
   last.push(copy); // push copy into last
}

console.log(last);

ps:您可以使用点符号arr.t1代替arr['t1']

答案 1 :(得分:1)

使用['t2']进行数组访问不是问题。这是一个常规的JavaScript功能。

问题是:您正在将SAME数组添加到“last”(代码中为5次,屏幕截图中为3次)。 每次设置['t2'] = i时,您也会更改“last”中的值,因为它们实际上只是对同一个数组实例的引用。

在将数组添加到“last”之前,必须先创建数组的副本/克隆。

这是在所有语言中发生的事情,其中​​数组是对象的引用(Java,C#...)。它适用于C ++ STL。