【问题标题】:Merge array of complex objects by using Lodash使用 Lodash 合并复杂对象数组
【发布时间】:2016-09-20 22:42:22
【问题描述】:

我是 Lodash 的新手,正在尝试解决这个问题,但我可以找到一个好方法来解决这个问题。

我有一个从数据库返回的对象数组。数据结构如下:

var data = [{
    index: 1,
    Aoo: "a1",
    Boo: 'b2',
}, {
    index: 1,
    Aoo: "a2",
    Boo: 'b2',
}, {
    index: 2,
    Aoo: "a3",
    Boo: 'b3',
}];

我想先按索引对对象进行分组,然后将属性“Aoo”和“Boo”分组,并将其放入一个名为param 的数组属性中。

var result = [{
        index: 1,
        param: [{
            Aoo: 'A1',
            Boo: 'B1'
        },{
            Aoo: 'A2',
            Boo: 'B2',
        }]
    }, {
        index: 2,
        param: [{
            Aoo: 'A3',
            Boo: 'B3'
        }]
   }
]

我可以手动完成,但我想充分利用 Lodash 的功能。现在我只知道我可以通过使用_.groupBy('index') 来实现分组的第一步,我被困在下一步该做什么上。

【问题讨论】:

    标签: javascript arrays json underscore.js lodash


    【解决方案1】:

    你快到了。这是如何使用 lodash 完成的

    var data = [{
        index: 1,
        Aoo: "a1",
        Boo: 'b2',
    }, {
        index: 1,
        Aoo: "a2",
        Boo: 'b2',
    }, {
        index: 2,
        Aoo: "a3",
        Boo: 'b3',
    }];
    
    var result = _.chain(data)
      .groupBy('index')
      .map((value, key) => {
        return {
          index: Number(key), //the index was transformed into a string, this will make it a number again.
          param: _.map(value, o => _.omit(o, 'index'))//do not include the index key from the previous objects
        }
      })
      .value();
    
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.1/lodash.min.js"></script>

    诚然,第二部分比分组稍微复杂一些,但也不是很多。由于索引为您提供了这种结构:

    {
      "1": [
        {
          "index": 1,
          "Aoo": "a1",
          "Boo": "b2"
        },
        {
          "index": 1,
          "Aoo": "a2",
          "Boo": "b2"
        }
      ],
      "2": [
        {
          "index": 2,
          "Aoo": "a3",
          "Boo": "b3"
        }
      ]
    }

    您真正想要做的就是检查它,使每个键成为index 属性,然后您会得到一个初始对象数组。每个都需要通过删除index 键进行转换,并将分配给param 值。这是使用.map 一次性完成的。不幸的是,它并没有看起来那么漂亮,但我认为这是使用 Lodash 的基本版本所能做的最好的事情。

    如果您想选择键的特定子集,而不是“除了 index 之外的所有”,那么您可以使用 _.pick 而不是 _.omit 来做到这一点。这是它的外观:

    var data = [{
        index: 1,
        Aoo: "a1",
        Boo: 'b2',
        Coo: "c1"
    }, {
        index: 1,
        Aoo: "a2",
        Boo: 'b2',
        Coo: "c2"
    }, {
        index: 2,
        Aoo: "a3",
        Boo: 'b3',
        Coo: "c3"
    }];
    
    var result = _.chain(data)
      .groupBy('index')
      .map((value, key) => {
        return {
          index: Number(key), //the index was transformed into a string, this will make it a number again.
          param: _.map(value, o => _.pick(o, ['Aoo', 'Boo']))//do not include the index key from the previous objects
        }
      })
      .value();
    
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.1/lodash.min.js"></script>

    所以即使数据中有一个额外的键,我们也会得到相同的结果。

    【讨论】:

    • 在字面上发布一个字符回答字符后几秒钟 :)
    • 感谢您的快速响应!我确实有一个后续问题。如果我有更多不想包含的属性怎么办?我需要一张一张地映射吗?例如:{Aoo: "a", Boo: "b", Coo: "c", Doo: "d"} 而我只想结合BooCoo?谢谢!
    • 如果您只想选择特定属性,请使用_.pick() 而不是_.omit(),因为它会适得其反。
    • @CocoHot 我已经添加了一个示例来说明它的外观。
    猜你喜欢
    • 2019-05-07
    • 1970-01-01
    • 2016-12-31
    • 2016-06-12
    • 2018-08-07
    • 1970-01-01
    • 2021-03-11
    • 2020-09-16
    • 2017-06-08
    相关资源
    最近更新 更多