【问题标题】:Group array by property name and add count [closed]按属性名称对数组进行分组并添加计数[关闭]
【发布时间】:2019-04-09 17:10:09
【问题描述】:

我有以下数据结构:

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 实现这一目标?

【问题讨论】:

    标签: javascript arrays underscore.js lodash


    【解决方案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)

    【讨论】:

    • 谢谢,它在这里运行,但我收到一个语法错误“预期:”...现在正在研究它,一旦我可以让它工作,我会尽快接受。非常感谢您实际回答了我非常具体的问题。
    • 我将其标记为已接受,但它有两个问题:forEach(({ MainHeader, SubHeader }) 抛出错误并且 Object.values 在 IE 中不起作用。我设法消除了第二个问题,但 forEach(({ MainHeader, SubHeader }) 我需要返工...知道怎么做吗?我不熟悉这种语法,在 forEach 的文档中找不到它
    • @sarsnake 可能是因为destructuring 的参数(新的ES6 语法)。没有它你也可以使用它,像这样:jsfiddle.net/adigas/u0js2pbh(Object.values 也是 ES6 BTW)
    • 谢谢,但它仍然无法在这个 IE11 上运行......我不得不支持很遗憾
    • @sarsnake 使用 ES5 语法的替代方法(对于 IE11)更新了答案。希望我已经涵盖了所有内容(let 到 var,箭头函数到 function,删除解构,更改使用 Object.keys 来获取值等)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2015-12-31
    相关资源
    最近更新 更多