如何使用map/filter来修改对象数组的内容?
我有以下的数组:如何使用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.
我想修改原始数组。
如果恰好有一个比赛,那么你可以使用find
:
myarray.find(someobject => someobject.key == 'B').mark = "marked!"
如果你不知道比赛的数量,那么你for
循环似乎做到这一点的最好办法。否则,你可能例如去为filter
和forEach
:
myarray.filter(someobject => someobject.key == 'B')
.forEach(someobject => someobject.mark = "marked!")
我觉得很优雅。 – Rolando
什么是最好的方式,这样我可以把它,这样我可以使用地图/过滤功能在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'; });
我还没有理解为什么使用for循环而不是foreach更好。你能解释一下吗? –
@Marco Luzzara:使用'for'并不比使用可链式方法更好。在这种情况下,'.filter'和'.forEach'的顺序是完全合理的,这也是JS首先可以链接的原因。所有看起来干净和合理。 虽然,我会减少'.filter'示例的复杂性,因为不需要在'.filter'内部解构'item'以进一步获取'key'属性。 '.filter(item => item.key ==='B')'看起来更具可读性和可维护性。 – Denialos
@MarcoLuzzara它更短,更高性能,看起来更加紧迫,并允许使用任意控制结构。 – Bergi
无论是'map'还是'filter' * modify *数组。他们创造新的。 – Bergi
你有什么问题?我会说这是“最好的方式”,因为它很明显是什么意图。 –