微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Javascript:使用 groupBy 将对象列表转换为嵌套对象列表

如何解决Javascript:使用 groupBy 将对象列表转换为嵌套对象列表

这是我正在使用的 JavaScript 对象列表:

var filtered = [
{'faculty': 'Faculty of Sciences','degree': 'bachelor','majorName': 'Computer Science'},{'faculty': 'Faculty of Sciences','majorName': 'Business Computing'},'degree': 'masters',{'faculty': 'School of Arts','majorName': 'Graphic Design'},'majorName': 'Media and Communication'},'majorName': 'Musicology'},'majorName': 'Media'}]

我想通过按教员和学位分组将其转换为嵌套对象列表。

请运行此程序以查看我当前的结果:

var filtered = [{
    'faculty': 'Faculty of Sciences','majorName': 'Computer Science'
  },{
    'faculty': 'Faculty of Sciences','majorName': 'Business Computing'
  },{
    'faculty': 'School of Arts','majorName': 'Graphic Design'
  },'majorName': 'Media and Communication'
  },'majorName': 'Musicology'
  },'majorName': 'Media'
  }
]


var grouped = _.mapValues(_.groupBy(filtered,'faculty'),flist => flist.map(filtered => _.omit(filtered,'faculty')));

_.forEach(grouped,function(value,key) {
  grouped[key] = _.groupBy(grouped[key],function(item) {
    return item.degree;
  });
});

console.log(grouped);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js"></script>

如何省略遗留的“degree”属性?并将“majorName”属性的值保留在属于生成的度属性的列表中?

最终结果可能是这样的:

{
"Faculty of Sciences": {
    "bachelor": ["Computer Science","Business Computing"],"masters": ["Computer Science","Business Computing"]
},"School of Arts": {
    "bachelor": ["Graphic Design","Media and Communication"],"masters": ["Musicology","Media"]
}
}

谢谢:)

解决方法

使用 reduce()destructuringlogical nullish assignment (??=) 可为您提供简洁的原版解决方案。

const
  filtered = [{ 'faculty': 'Faculty of Sciences','degree': 'bachelor','majorName': 'Computer Science' },{ 'faculty': 'Faculty of Sciences','majorName': 'Business Computing' },'degree': 'masters',{ 'faculty': 'School of Arts','majorName': 'Graphic Design' },'majorName': 'Media and Communication' },'majorName': 'Musicology' },'majorName': 'Media' }],groupedObjs = filtered.reduce((a,{ faculty,degree,...rest }) =>
    (((a[faculty] ??= { [degree]: [] })[degree] ??= []).push({ ...rest }),a),{}),groupedStrings = filtered.reduce((a,majorName }) =>
    (((a[faculty] ??= { [degree]: [] })[degree] ??= []).push(majorName),{});

console.log(groupedStrings);
console.log(groupedObjs);
.as-console-wrapper { max-height: 100% !important; top: 0; }

或者没有逻辑空赋值...

const
  filtered = [{ 'faculty': 'Faculty of Sciences',...rest }) => {
    a[faculty] = a[faculty] || { [degree]: [] };
    (a[faculty][degree] = a[faculty][degree] || []).push({ ...rest });
    return a
  },majorName }) => {
    a[faculty] = a[faculty] || { [degree]: [] };
    (a[faculty][degree] = a[faculty][degree] || []).push(majorName);
    return a
  },{});

console.log(groupedStrings);
console.log(groupedObjs);
.as-console-wrapper { max-height: 100% !important; top: 0; }

,

您可以再次 .map 每个数组以仅选择 majorName 字段。

这是一个例子

const filtered = [{ 'faculty': 'Faculty of Sciences','majorName': 'Media' }];

const grouped = _(filtered).groupBy('faculty')
  .mapValues(l => _(l).map(o => _.omit(o,'faculty'))
    .groupBy("degree")
    .mapValues(x => _(x).map(y => y.majorName))
  )

console.log(grouped);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js"></script>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。