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作为({})返回,而无需进行函数处理。这是一种箭头函数用法,如果可能,请查看箭头函数文档。