按属性名称对数组进行分组并添加计数

时间:2019-04-09 17:10:10

标签: javascript arrays underscore.js lodash

我具有以下数据结构:

var data = [
   { MainHeader: Header1, SubHeader: 'one'},
   { MainHeader: Header1, SubHeader: 'two'},
   { MainHeader: Header2, SubHeader: 'three'},
   { MainHeader: Header2, SubHeader: 'four'},
   { MainHeader: Header2, SubHeader: 'five'}
];

我需要将其变成这样:

var groupheaders = [
  { startColName: 'one', numberofCols: 2, title: Header1},
  { startColName: 'three', numberofCols: 3, title: Header2}
];

有没有一种优雅的方法可以用lodash做到这一点?谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用每个MainHeader作为键的映射对象。如果已经添加了MainHeader,请更新密钥的计数。否则,添加一个新键和一个对象作为其值

然后,使用Object.values()以数组形式获取值:

const data = [{MainHeader:"Header1",SubHeader:"one"},{MainHeader:"Header1",SubHeader:"two"},{MainHeader:"Header2",SubHeader:"three"},{MainHeader:"Header2",SubHeader:"four"},{MainHeader:"Header2",SubHeader:"five"}],
      map = {};

data.forEach(({ MainHeader, SubHeader }) => {
  if(map[MainHeader])
    map[MainHeader].numberofCols++
  else
    map[MainHeader] = { title: MainHeader, startColName: SubHeader, numberofCols: 1 };
})

let output = Object.values(map);

console.log(output)

ES5解决方案:

var data = [{MainHeader:"Header1",SubHeader:"one"},{MainHeader:"Header1",SubHeader:"two"},{MainHeader:"Header2",SubHeader:"three"},{MainHeader:"Header2",SubHeader:"four"},{MainHeader:"Header2",SubHeader:"five"}],
      map = {};

data.forEach(function(o) {
  if(map[o.MainHeader])
    map[o.MainHeader].numberofCols++
  else
    map[o.MainHeader] = { title: o.MainHeader, startColName: o.SubHeader, numberofCols: 1 };
})

var output = Object.keys(map).map(function(k) {
  return map[k];
});

console.log(output)