【问题标题】:How to merge two array of objects when there is edit flag有编辑标志时如何合并两个对象数组
【发布时间】:2020-11-27 13:31:10
【问题描述】:

我有如下的对象数组

数组 1:

[{id: 1, name: 'Golden', isEdited: true}, {id: 2, name: 'Pearl'}]

数组 2:

[{id: 1, name: 'Golden'}, {id: 2, name: 'Pearlblue'}, , {id: 3, name: 'Orange'}]

现在我想合并这两个数组,如果对象包含 isEdited 标志,则意味着该对象不应该被更新。

预期的结果应该是

[{id: 1, name: 'Golden', isEdited: true}, {id: 2, name: 'Pearlblue'}, {id: 3, name: 'Orange'}]

我尝试过以下方法

b.map((battr) => {
 return {
   ...a[battr.id],
   ...battr
 }
})

但它返回输出为

[{id: 1, name: 'Golden'}, {id: 2, name: 'Pearlblue'}, {id: 3, name: 'Orange'}]

【问题讨论】:

    标签: javascript arrays collections lodash


    【解决方案1】:

    小心,您的ids 与您的数组索引不匹配。 因此,在您的尝试中,a[battr.id] 应该被替换为 a.find(a => a.id === battr.id)

    您的示例令人困惑,因为在两个数组中,id=1 的名称都是“Golden”,但假设您只需要数组 A 中的属性(如果 isEdited=true),您的解决方案可能是:

    b.map((b_attr) => {
      var matchingA = a.find(a_attr => a_attr.id === b_attr.id);
      if (matchingA && matchingA.isEdited)
        return matchingA;
      else
        return { ...matchingA, ...b_attr }
    })
    

    【讨论】:

    • 如果a有像[{id: 1, name: 'Golden', isEdited: true}, {id: 2, name: 'Pearl'}, {id: 4, name: 'Red'}]这样的对象,如果我们运行上述逻辑,那么此时{id: 4, name: 'Red'}就被错过了。
    • 然后在上述逻辑之后添加那些对象:b.map( ... ).concat(a.filter(x => !b.some(y => y.id === x.id)))
    猜你喜欢
    • 2022-01-04
    • 2021-03-08
    • 2018-05-13
    • 1970-01-01
    • 2020-02-04
    • 2015-01-26
    • 2012-08-06
    相关资源
    最近更新 更多