2017-07-03 102 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