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)
一个简单的函数就足够了;请记住,您需要使用let
orvar
代替const
for items
;map 不会就地编辑,而是返回一个新数组。您可以就地编辑,但我不一定推荐它。
items = items.map(item => {
return (item._id === changeThis._id) ?
{ ...item, ...changeThis } :
item
});
Run Code Online (Sandbox Code Playgroud)
通过将 的内容扩展changeThis
到 的键之后的对象中item
,任何出现在 中的键都changeThis
将覆盖来自 的键item
。来自任一对象的非重复键也将出现在最终结果中。