2015-11-02 258 views
9

我想更改每个循环中的当前对象,但它不起作用,为什么它不起作用,我该怎么做?Js在每个循环中更改数组内的对象

var arr = [{num: 1}, {num: 2}]; 

arr.forEach(function(item) { 
    item = {somethingElse: 1} 
}); 

console.log(arr); 
+0

我相信你的意思是映射列表? 'arr.map(function(item){return {somethingElse:1}});' – Ziki

回答

22

它不工作,因为你正在做的是更新你给出的参数(item),不具有对数组的实时连接的值。只要您的回调返回,该更改就会消失。

最合适的方式做到这一点是使用map

var arr = [{num: 1}, {num: 2}]; 

arr = arr.map(function(item) { 
    return {somethingElse: 1}; 
}); 

console.log(arr); 

map给你的函数的每个项目,并建立一个新阵列从任何你回来。

如果您更新就地阵列,而不是建立一个新的这一点很重要,你可以使用forEach,你只需要分配回你在更新数组元素。第二个参数forEach的回调是你所访问的指数,所以:

var arr = [{num: 1}, {num: 2}]; 

arr.forEach(function(item, index) { 
    arr[index] = {somethingElse: 1}; 
}); 

console.log(arr); 

当然,在这两种情况下上面,你会真正使用item的东西,你不是活得t在您的示例代码中...如果您想要在item上添加/删除属性,请不要完全替换该对象,Cyril's answer会向您显示如何执行此操作。

+0

@epascarello:谢谢,修正。 –

1

您正在更改回调函数中的本地参考item

要改变数组的内容,你需要使用数组索引和分配新的参考吧,如下图所示

arr.forEach(function(item, i) { 
    arr[i] = {somethingElse: 1} //using index, change the reference in array 
}); 
0

你是不是在对象上工作,所以更改不会转移。

你可以这样做,而不是:

arr.forEach(function(item, ind, array) { 
    array[ind] = {somethingElse: 1} 
}); 
4

另一个品种答案

var arr = [{num: 1}, {num: 2}]; 

arr.forEach(function(item) { 
    item.something = 2;//setting the value 
    delete item.num;//deleting the num from the object 
}); 
+1

是的,这是另一种可能性:突变对象。 –