如何解决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()
、destructuring 和 logical 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 举报,一经查实,本站将立刻删除。