【问题标题】:How to merge objects by key in javascript with Lodash如何使用 Lodash 在 javascript 中按键合并对象
【发布时间】:2018-05-27 12:31:49
【问题描述】:

我有这个对象数组:

[
  {
    id: 1, oid: 5, 
    dates: { 
      5: {start_date: "12.30", end_date: "12.31" },
      14: {start_date: "01.01", end_date: "01.15" }
    }
  },
  {
    id: 2, oid: 5, 
    dates: { 
      17: {start_date: "02.01", end_date: "02.20" },
      19: {start_date: "03.01", end_date: "03.10" }
    }
  }
]

如何通过“日期”键合并并用 Lodash 得到这个结果

{
  5: {start_date: "12.30", end_date: "12.31" },
  14: {start_date: "01.01", end_date: "01.15" },
  17: {start_date: "02.01", end_date: "02.20" },
  19: {start_date: "03.01", end_date: "03.10" }
}

【问题讨论】:

  • 仅供参考,您的预期输出格式不正确
  • 关键是什么?
  • @Alexandru-IonutMihai 我猜 OP 正在寻找 [{}, {}, {}] 格式。
  • @Rajesh,是的,但他按一个键分组。但是...密钥的名称是什么?\
  • 好的。我写问题时犯了一个错误。我编辑了问题。

标签: javascript object merge lodash


【解决方案1】:
 const output = input.reduce((res, {dates}) => res.concat(dates), []);

您可以使用reduce 来迭代对象并使用concat 一起迭代结果。根本不需要使用 loadash。

【讨论】:

    【解决方案2】:

    使用 Lodash

    您可以使用_.map() 来获取日期对象的数组。要将对象合并为一个,将使用_.merge()。我们将使用_.partial() 添加一个目标对象,因此我们不会改变原始数据。此外,我们将在_.merge() 上使用_.spread() 方法,因此它可以处理对象数组:

    var data = [{"id":1,"oid":5,"dates":{"5":{"start_date":"12.30","end_date":"12.31"},"14":{"start_date":"01.01","end_date":"01.15"}}},{"id":2,"oid":5,"dates":{"17":{"start_date":"02.01","end_date":"02.20"},"19":{"start_date":"03.01","end_date":"03.10"}}}];
    
    
    var result = _.spread(_.partial(_.merge, {}))(_.map(data, 'dates'));
    
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

    使用 ES6

    Object#keys 上使用Array#map 提取dates,然后通过spreadingObject.assign 压平为Object.assign

    var data = [{"id":1,"oid":5,"dates":{"5":{"start_date":"12.30","end_date":"12.31"},"14":{"start_date":"01.01","end_date":"01.15"}}},{"id":2,"oid":5,"dates":{"17":{"start_date":"02.01","end_date":"02.20"},"19":{"start_date":"03.01","end_date":"03.10"}}}];
    
    var result = Object.assign({}, ...Object.keys(data).map((key) => data[key].dates));
    
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

    【讨论】:

    • 但日期是 dates:{} 而不是 dates:[]。也许我需要转换为数组?
    • 您的日期对象无效,因为它缺少属性名称。这是无效的{{}}。这是有效的{ prop: {} }
    • 好的。我写问题时犯了一个错误。我编辑问题。
    【解决方案3】:

    使用 lodash,您可以首先使用 spread operator map 日期和 assign 一起使用 spread operator

    let result = _.assign({}, ..._.map(data, 'dates'))
    

    【讨论】:

      猜你喜欢
      • 2018-08-07
      • 1970-01-01
      • 2017-09-20
      • 2016-12-31
      • 2016-12-28
      • 2017-07-21
      • 2016-05-05
      • 2016-05-24
      • 1970-01-01
      相关资源
      最近更新 更多