如何使用映射/过滤器修改对象数组的内容?

Rol*_*ndo 7 javascript

我有以下数组:

myarray = [{ 'key': 'A', }, {'key': 'B'}]

什么是最好的方法,以便我可以使用javascript中的映射/过滤器函数来执行以下操作:

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

当我尝试类似的事情时:

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

我想修改原始数组。

tri*_*cot 16

如果只有一个匹配项,那么您可以使用find

myarray.find(someobject => someobject.key == 'B').mark = "marked!"
Run Code Online (Sandbox Code Playgroud)

如果您不知道匹配的数量,那么您的for循环似乎是最好的方法。否则你可以例如去filterforEach

myarray.filter(someobject => someobject.key == 'B')
       .forEach(someobject => someobject.mark = "marked!")
Run Code Online (Sandbox Code Playgroud)


Ber*_*rgi 5

最好的方法是什么,以便我可以使用 javascript 中的映射/过滤器函数来执行与此代码相同的操作?

不是全部,因为既不修改map也不filter 修改数组。他们创造新的。你可以使用类似的东西

let newArray = myArray.map(({key} => ({key, marked: key=='B'}));
Run Code Online (Sandbox Code Playgroud)

但与你的代码等效的最好的 ES6 是

for (let v of myArray) if (v.key == 'B') v.mark = 'marked';
Run Code Online (Sandbox Code Playgroud)

您也可以使用forEach,但我强烈建议不要在函数式方法中掩盖副作用:

myArray.filter(({key}) => key == 'B').forEach(v => { v.mark = 'marked'; });
Run Code Online (Sandbox Code Playgroud)