JS:替换数组内特定对象的某些字段

use*_*695 4 javascript ecmascript-6

我得到了一个如下所示的对象数组:

const items = [
  {_id: "Tk2dc3fq99qZ7YdQQ", parent: "Dn59y87PGhkJXpaiZ", content: "one", context: "default"}
  {_id: "uK4MYJJGa6ra9e99v", parent: "Dn59y87PGhkJXpaiZ", content: "two", context: "default"}
]
Run Code Online (Sandbox Code Playgroud)

注意: items 是只读的,因为它来自 react 组件中的 prop

我想通过这样的给定对象更新内容:

const changeThis = { _id: "uK4MYJJGa6ra9e99v", context: "info" }
Run Code Online (Sandbox Code Playgroud)

因此,具有匹配 ID 的对象应该将 'info' 作为新的上下文值,同时保留所有其他元素:

[
  {_id: "Tk2dc3fq99qZ7YdQQ", parent: "Dn59y87PGhkJXpaiZ", content: "one", context: "default"}
  {_id: "uK4MYJJGa6ra9e99v", parent: "Dn59y87PGhkJXpaiZ", content: "two", context: "info"}
]
Run Code Online (Sandbox Code Playgroud)

另一个例子

和...

const changeThis = { _id: "uK4MYJJGa6ra9e99v", context: "info", content: "new" }
Run Code Online (Sandbox Code Playgroud)

...应该更改匹配对象的上下文和内容:

[
  {_id: "Tk2dc3fq99qZ7YdQQ", parent: "Dn59y87PGhkJXpaiZ", content: "one", context: "default"}
  {_id: "uK4MYJJGa6ra9e99v", parent: "Dn59y87PGhkJXpaiZ", content: "new", context: "info"}
]
Run Code Online (Sandbox Code Playgroud)

我的尝试

所以首先我会map()用来遍历数组,但是如何使用changeThis-object更新所有其他字段?我尝试使用assign()并且keys()尝试忽略 _id 键:

items.map((item, index) => {
  if (item._id === changeThis._id) {
    Object.assign(
      {},
      ...Object.keys(item).map(k => (
        {
          [k]: changeThis.indexOf(k) > -1 && k !== '_id'
            ? changeThis[k]
            : item[k]
        }
    ))
  }
});
Run Code Online (Sandbox Code Playgroud)

tre*_*son 5

一个简单的函数就足够了;请记住,您需要使用letorvar代替constfor items;map 不会就地编辑,而是返回一个新数组。您可以就地编辑,但我不一定推荐它。

items = items.map(item => {
  return (item._id === changeThis._id) ?
    { ...item, ...changeThis } :
    item
});
Run Code Online (Sandbox Code Playgroud)

通过将 的内容扩展changeThis到 的键之后的对象中item,任何出现在 中的键都changeThis将覆盖来自 的键item。来自任一对象的非重复键也将出现在最终结果中。