2017-07-03 61 views
1

我有以下的數組:如何使用map/filter來修改對象數組的內容?

myArray的= [{ '鍵': 'A', }, { '鍵': 'B'}]

是什麼,以便最好的方式我可以把它,這樣我可以使用地圖/過濾功能在javascript做等價的:

for(var i = 0; i < myarray.length; i++) { 
if(myarray[i].key == 'B') { 
    myarray[i].mark = "marked!" 
    } 
} 

當我嘗試類似:

myarray.filter((someobject) => someobject.key == 'B').mark = "marked!" 
console.log(myarray) // this does not show the "mark" key. 

我想修改原始數組。

+0

無論是'map'還是'filter' * modify *數組。他們創造新的。 – Bergi

+1

你有什麼問題?我會說這是「最好的方式」,因爲它很明顯是什麼意圖。 –

回答

1

如果恰好有一個比賽,那麼你可以使用find

myarray.find(someobject => someobject.key == 'B').mark = "marked!" 

如果你不知道比賽的數量,那麼你for循環似乎做到這一點的最好辦法。否則,你可能例如去爲filterforEach

myarray.filter(someobject => someobject.key == 'B') 
     .forEach(someobject => someobject.mark = "marked!") 
+0

我覺得很優雅。 – Rolando

1

什麼是最好的方式,這樣我可以把它,這樣我可以使用地圖/過濾功能在JavaScript中執行此代碼相當於?

並非所有的,因爲無論是map也不filter修改陣列。他們創造新的。您可以使用類似

let newArray = myArray.map(({key} => ({key, marked: key=='B'})); 

但ES6相當於向你的代碼是

for (let v of myArray) if (v.key == 'B') v.mark = 'marked'; 

你也可以使用forEach,但我嚴重建議不要在功能方法掩飾副作用:

myArray.filter(({key}) => key == 'B').forEach(v => { v.mark = 'marked'; }); 
+0

我還沒有理解爲什麼使用for循環而不是foreach更好。你能解釋一下嗎? –

+0

@Marco Luzzara:使用'for'並不比使用可鏈式方法更好。在這種情況下,'.filter'和'.forEach'的順序是完全合理的,這也是JS首先可以鏈接的原因。所有看起來乾淨和合理。 雖然,我會減少'.filter'示例的複雜性,因爲不需要在'.filter'內部解構'item'以進一步獲取'key'屬性。 '.filter(item => item.key ==='B')'看起來更具可讀性和可維護性。 – Denialos

+0

@MarcoLuzzara它更短,更高性能,看起來更加緊迫,並允許使用任意控制結構。 – Bergi