【问题标题】:How to merge two arrays which are inside individual objects as property如何将单个对象内的两个数组合并为属性
【发布时间】:2019-12-25 08:01:11
【问题描述】:

我有两个这样的对象:

let obj1 = { slotIDs: ["5e0301f353ee2a0546298f15"] }
let obj2 = { slotIDs: ["5e0301f353ee2a0546298f15", "5e03050453ee2a0546298f1c"] }

我需要像这样将它们合并到一个数组中

let newObj = ["5e0301f353ee2a0546298f15", "5e03050453ee2a0546298f1c"]

我尝试过使用 lodash union 和 map 但没有成功。

【问题讨论】:

    标签: javascript lodash higher-order-functions


    【解决方案1】:

    一行代码解决方案:

    let obj1 = { slotIDs: ['5e0301f353ee2a0546298f15'] }
    let obj2 = { slotIDs: ['5e0301f353ee2a0546298f15', '5e03050453ee2a0546298f1c'] }
    
    const result = [...new Set([...obj1.slotIDs, ...obj2.slotIDs])]
    console.log(result)

    【讨论】:

      【解决方案2】:

      使用 Vanilla JS,您可以使用 Array.flatMap() 进行迭代并返回 slotIDs 以获取 id 数组。要删除重复项,请从数组中创建一个 Set,然后将 Set 传播回一个数组:

      const obj1 = { slotIDs: ['5e0301f353ee2a0546298f15'] }
      const obj2 = { slotIDs: ['5e0301f353ee2a0546298f15', '5e03050453ee2a0546298f1c'] }
      
      const result = [...new Set([obj1, obj2].flatMap(o => o.slotIDs))]
      
      console.log(result)

      使用 lodash,您可以使用 _.flatMap() 进行迭代,并使用 slotIDs 来获取 id 数组。使用_.uniq() 删除重复项:

      const obj1 = { slotIDs: ['5e0301f353ee2a0546298f15'] }
      const obj2 = { slotIDs: ['5e0301f353ee2a0546298f15', '5e03050453ee2a0546298f1c'] }
      
      const result = _.uniq(_.flatMap([obj1, obj2], 'slotIDs'))
      
      console.log(result)
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

      【讨论】:

        【解决方案3】:

        试试

        let newObj= []
        for(const value in Object.assign(obj1,obj2)["slotIDs"])
        newObj.push(Object.assign(obj1,obj2)["slotIDs"][value])
        

        编辑- 这是一个更简单或单行的版本。

        let newObj=Object.assign(obj1,obj2)["slotIDs"]
        

        正如@OriDrori 建议的那样,上述方法会改变 obj1 本身,并且在 Obj1 具有多个键值对的类似问题中效果不佳。为避免这种情况,您可以采取以下措施

        let newObj=Array.from(new Set(obj1.slotIDs.concat(obj2.slotIDs)))
        

        快速说明 - 使用 Array.from() 是可选的。

        【讨论】:

        • @MianMuhammad 我不会争论,这就是你喜欢的方式:-)
        • 您的代码用obj2.slotIDs 覆盖obj1.slotIDs,并且不合并数组,只获取唯一值。给obj1.slotIDs添加另一个唯一的id,它会在结果中消失,或者只是将assign中的对象顺序更改为obj2, obj1,然后检查结果。
        • @OriDrori 解决方案是问题是特定于问题的,这不是最好的解决方案,我同意。
        • 不过我也会添加一个更好的解决方案 :)
        • 代码Object.assign(obj1,obj2)["slotIDs"] 不是解决方案。它完全是做其他事情。
        【解决方案4】:

        Object.assign(obj1, obj2).slotIDs

        const obj1 = { slotIDs: ['5e0301f353ee2a0546298f15'] }
        const obj2 = { slotIDs: ['5e0301f353ee2a0546298f15', '5e03050453ee2a0546298f1c'] }
        
        const result = Object.assign(obj1, obj2).slotIDs
        
        console.log(result)

        【讨论】:

        • 您的代码用obj2.slotIDs 覆盖obj1.slotIDs,并且不合并数组,只获取唯一值。给obj1.slotIDs添加另一个唯一的id,它会在结果中消失,或者只是将assign中的对象顺序更改为obj2, obj1,然后查看结果。
        【解决方案5】:

        编辑:

        let obj1 = { slotIDs: ['5e0301f353ee2a0546298f15', '5e0301f353ee2a0546298f16'] }
        let obj2 = { slotIDs: ['5e0301f353ee2a0546298f15', '5e03050453ee2a0546298f1c'] }
        
        let result = Array.from( new Set(obj1.slotIDs.concat(obj2.slotIDs)) )
        
        console.log(result)

        旧答案:

        { ...obj1, ...obj2 }.slotIDs怎么样?

        let obj1 = { slotIDs: ['5e0301f353ee2a0546298f15'] }
        let obj2 = { slotIDs: ['5e0301f353ee2a0546298f15', '5e03050453ee2a0546298f1c'] }
        
        let result = { ...obj1, ...obj2 }.slotIDs
        
        console.log(result)

        【讨论】:

        • 哇,这是另一个简单的解决方案谢谢:)
        【解决方案6】:

        如果您的对象可以具有保存数组值的其他属性,并且您希望将所有这些属性合并到一个唯一的数组中,您可以使用Object.entries().map(),然后使用Set 来删除重复项:

        const obj1 = { slotIDs: ["5e0301f353ee2a0546298f15"], itemIds: ["xyz123"] };
        const obj2 = { slotIDs: ["5e0301f353ee2a0546298f15", "5e03050453ee2a0546298f1c"], itemids: ["xyz123", "abc123"] };
        
        const res = [...new Set([obj1, obj2].map(Object.values).flat(2))];
        console.log(res);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-18
          • 1970-01-01
          • 2019-01-15
          • 2018-09-21
          • 1970-01-01
          • 2022-11-08
          相关资源
          最近更新 更多