【问题标题】:Combine single array of objects by unique attribute通过唯一属性组合单个对象数组
【发布时间】:2017-08-24 09:52:16
【问题描述】:

我有一个对象数组,它是基于唯一属性组合的。 例如:

[
  { "macId": "123", "input": 30},
  { "macId": "567", "input": 40},
  { "macId": "123", "power": 100},
  { "macId": "567", "power": 250}
]

我想要得到的对象数组如下:

[
  { "macId": "123", "input": 30, "power": 100},
  { "macId": "567", "input": 40 "power": 250}
]

lodash 可以做到这一点吗?如果没有,我该如何为此编写一个短代码?

【问题讨论】:

  • 我几乎可以肯定你可以用 Array.reduce 和一些算法做点什么
  • 看看lodash的merge
  • 只是提醒@chetanraj。这里有多个答案可以回答您的问题。我建议您选择一个作为已接受的答案,以便我们将其标记为已解决。 (或者如果您认为这个问题没有得到解决,也许您可​​以澄清答案如何误解了您的问题,以便其他人可以尝试在考虑到这些新信息的情况下回答您的问题)。

标签: javascript arrays lodash arrayobject


【解决方案1】:

使用 lodash 我会尝试使用 groupBymacId,然后使用 merge 来“组合”结果数组中的对象。

const after = 
  _(before)
    .groupBy('macId')
    .map(group => _.merge(...group))
    .value();

【讨论】:

    【解决方案2】:

    我建议将 ES6 MapObject.assign 结合使用:

    const arr = [
        { "macId": "123", "input": 30},
        { "macId": "567", "input": 40},
        { "macId": "123", "power": 100},
        { "macId": "567", "power": 250}
    ]
    
    const result = [...arr.reduce((acc, obj) =>
        acc.set(obj.macId, Object.assign(acc.get(obj.macId) || {}, obj)), new Map).values()];
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案3】:

      您可以使用Object#assignArray#find 执行以下操作:

      var myMergedArray = arr.reduce((acc = [], val) => {
        if (acc.filter(obj => obj.macId === val.macId).length !== 0) {
          Object.assign(acc.find((el) => el.macId === val.macId), val)
        } else {
          acc.push(val);
        }
        return acc;
      }, [])
      

      片段:

      var arr = [
        { "macId": "123", "input": 30},
        { "macId": "567", "input": 40},
        { "macId": "123", "power": 100},
        { "macId": "567", "power": 250}
      ]
      
      var myMergedArray = arr.reduce((acc = [], val) => {
        if (acc.filter(obj => obj.macId === val.macId).length !== 0) {
          Object.assign(acc.find((el) => el.macId === val.macId), val)
        } else {
          acc.push(val);
        }
        return acc;
      }, [])
      
      console.log(myMergedArray);

      【讨论】:

        【解决方案4】:

        由于您已标记lodash,您可以轻松地将其分组并轻松映射回来(使用reduce 或_.merge 合并)。

        var arr = [
          { "macId": "123", "input": 30},
          { "macId": "567", "input": 40},
          { "macId": "123", "power": 100},
          { "macId": "567", "power": 250}
        ]
        
        var unique = _.chain(arr).groupBy('macId').map(v => _.merge(...v)).value();
        
        console.log(unique)
        <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

        【讨论】:

          猜你喜欢
          • 2018-08-15
          • 1970-01-01
          • 2019-05-05
          • 1970-01-01
          • 2019-01-15
          • 1970-01-01
          • 2020-07-25
          • 1970-01-01
          • 2020-09-15
          相关资源
          最近更新 更多