使用lodash或ES5对对象进行分组

时间:2017-08-02 08:11:01

标签: arrays json node.js typescript lodash

我是一个javascript noobie,我开始使用库lodash,我遇到了一些问题。有人能帮我吗? :/

输入:

var a = [{group: 'A', title: 'test1', value: 'test2'},
         {group: 'A', title: 'test2', value: 'test3'},
         {group: 'B', title: 'test3', value: 'test4'},
         {group: 'B', title: 'test1', value: 'test2'},]

输出:

var a = {A: [
         { title: 'test1', value: 'test2'},
         { title: 'test2', value: 'test3'}
        ],
         B: [
         { title: 'test1', value: 'test2'},
         { title: 'test2', value: 'test3'}
        ],}

2 个答案:

答案 0 :(得分:0)

group by的lodash文档非常明确,您可以找到它here

在你的情况下,它看起来像这样。

_.groupBy(a, 'group')

您也可以使用 reduce 功能轻松自己完成。它看起来像这样:

let groups = a.reduce((grouping, currentItem) => {
    if (!grouping[currentItem.group]) {
        grouping[currentItem.group] = []
    }
    grouping[currentItem.group].push(currentItem);
    return grouping;
}, {});

可以找到一个工作示例here

在这两种情况下,结果都是一个对象,其中组为属性名称。

{
  "A": [{
    "group": "A",
    "title": "test1",
    "value": "test2"
  }, {
    "group": "A",
    "title": "test2",
    "value": "test3"
  }],
  "B": [{
    "group": "B",
    "title": "test3",
    "value": "test4"
  }, {
    "group": "B",
    "title": "test1",
    "value": "test2"
  }]
}

答案 1 :(得分:0)

您可以使用_.groupBy()进行分组,然后在每个组上使用_.mapValues(),通过使用_.omit()将对象映射到新对象,从对象中删除group属性。< / p>

&#13;
&#13;
const a = [{group: 'A', title: 'test1', value: 'test2'},
         {group: 'A', title: 'test2', value: 'test3'},
         {group: 'B', title: 'test3', value: 'test4'},
         {group: 'B', title: 'test1', value: 'test2'}
       ];
       
const result = _(a)
  .groupBy('group') // group by the group prop
  .mapValues((group) => group.map((o) => _.omit(o, 'group'))) // remove the group prop from each item
  .value();
  
console.log(result);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
&#13;
&#13;