我必须迭代一个数组,更改其中一个值,然后创建另一个数组来反映这些更改。
这是我到目前为止所做的:
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);
不幸的是,这些是我的结果
正如你所看到的,我没有得到所需的结果为0,1,2 ..而是我得到2,2,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。