Javascript 将一个数组中的匹配值添加到原始对象数组中
我有一个Javascript 将一个数组中的匹配值添加到原始对象数组中,javascript,lodash,Javascript,Lodash,我有一个用户列表,如下所示: [ { user: a, email: a.com, events: [] }, { user: b, email: b.com events: [] } ] 以及事件列表: [ { user: a, start: 2020-01-01 end: 2020-01-02
用户
列表,如下所示:
[
{
user: a,
email: a.com,
events: []
},
{
user: b,
email: b.com
events: []
}
]
以及事件列表:
[
{
user: a,
start: 2020-01-01
end: 2020-01-02
},
{
user: a,
start: 2020-02-01
end: 2020-02-02
},
{
user: b,
start: 2020-03-01
end: 2020-03-02
},
]
我试图将用户的事件列表合并到原始用户对象上的数组中,如下所示:
[
{
user: a,
email: a.com,
events: [
{
start: 2020-01-01
end: 2020-01-02
},
{
start: 2020-02-01
end: 2020-02-02
}
]
},
{
user: b,
email: b.com,
events: [
{
start: 2020-03-01
end: 2020-03-02
}
]
}
]
我最初的直觉是由每个用户简单地迭代事件列表,在它们通过user
value匹配的地方,将一个新对象推送到users.events数组。然而,我不是一个JS专业人士,我确信有一个assign/filter/map/reduce或lodash的组合可以简化这类问题。非常感谢您的帮助 请尝试以下操作:
const userEvents = [
{
user: a,
email: a.com,
events: []
},
{
user: b,
email: b.com,
events: []
}
]
const userStartEnds = [
{
user: a,
start: 2020-01-01,
end: 2020-01-02
},
{
user: a,
start: 2020-02-01,
end: 2020-02-02
},
{
user: b,
start: 2020-03-01,
end: 2020-03-02
},
]
[
{
user: a,
email: a.com,
events: [
{
start: 2020-01-01,
end: 2020-01-02
},
{
start: 2020-02-01,
end: 2020-02-02
}
]
},
{
user: b,
email: b.com,
events: [
{
start: 2020-03-01,
end: 2020-03-02
}
]
}
]
userEvents.map((userEvent) => ({
...userEvent,
events: userStartEnds
.filter(({ user }) => (userEvent.email === user.email))
.map(({ start, end }) => ({ start, end }))
}))
工作起来很有魅力!在过滤器中,我使用了.filter(user=>userEvent.email===user.email)
。。。({})
的任何原因?刚刚编辑的过滤器,映射实现。原始版本无法正常工作,因为我没有将JSON作为({})返回。您可以将JSON作为({})返回,而无需进行函数处理。这是一种箭头函数用法,如果可能,请查看箭头函数文档。