2015-11-02 256 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

是的,這是另一種可能性:突變對象。 –