提问人:JC Garcia 提问时间:1/24/2018 最后编辑:JC Garcia 更新时间:1/25/2018 访问量:3522
嵌套一些具有特定名称的键的对象数组
Group array of object nesting some of the keys with specific names
问:
我有这个对象数组,我需要修改它以使其更容易渲染。
const items = [
{
tab: 'Results',
section: '2017',
title: 'Full year Results',
description: 'Something here',
},
{
tab: 'Results',
section: '2017',
title: 'Half year Results',
description: 'Something here',
},
{
tab: 'Reports',
section: 'Marketing',
title: 'First Report',
description: 'Something here',
},
...
];
我正在尝试修改它,按特定键对它们进行分组。这个想法是有这个输出。如您所见,键的名称可能与项目中的实际名称不同。我认为这与以前的帖子有点不同。
const output = [
{
tab: 'Results',
sections: [
{
section: '2017',
items: [ { 'item that belongs here' }, { ... } ],
},
},
{
tab: 'Reports',
sections: [
{
section: 'Marketing',
items: [ { ... }, { ... } ],
},
},
...
]
我尝试使用 ,但它并没有完全按照我的要求。
关于如何处理它的任何想法?lodash.groupby
非常感谢!!
答:
5赞
Jamiec
1/24/2018
#1
这可以通过 和 的巧妙组合来完成。_.map
_.groupBy
const items = [
{
tab: 'Results',
section: '2017',
title: 'Full year Results',
description: 'Something here',
},
{
tab: 'Results',
section: '2017',
title: 'Half year Results',
description: 'Something here',
},
{
tab: 'Reports',
section: 'Marketing',
title: 'First Report',
description: 'Something here',
}
];
function groupAndMap(items, itemKey, childKey, predic){
return _.map(_.groupBy(items,itemKey), (obj,key) => ({
[itemKey]: key,
[childKey]: (predic && predic(obj)) || obj
}));
}
var result = groupAndMap(items,"tab","sections",
arr => groupAndMap(arr,"section", "items"));
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
3赞
Nina Scholz
1/24/2018
#2
您可以在没有其他库的情况下使用对象。
该对象包含一个属性,该属性保留给定嵌套组的嵌套数组。_
var items = [{ tab: 'Results', section: '2017', title: 'Full year Results', description: 'Something here' }, { tab: 'Results', section: '2017', title: 'Half year Results', description: 'Something here' }, { tab: 'Reports', section: 'Marketing', title: 'First Report', description: 'Something here' }],
keys = { tab: 'sections', section: 'items' }, // or more if required
result = [],
temp = { _: result };
items.forEach(function (object) {
Object.keys(keys).reduce(function (level, key) {
if (!level[object[key]]) {
level[object[key]] = { _: [] };
level._.push({ [key]: object[key], [keys[key]]: level[object[key]]._ });
}
return level[object[key]];
}, temp)._.push({ title: object.title, description: object.description });
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
评论
0赞
JC Garcia
1/24/2018
解决方案看起来非常整洁,谢谢!此外,@Jamiec解决方案效果很好,现在唯一的疑问是哪一个更有效......
0赞
sjahan
1/25/2018
@JCGarcia 我敢打赌这个,比使用 lodash 更原生。@Nina,是不是比使用简单的对象更好?非常好的解决方案,顺便说一句!Map
{}
0赞
Nina Scholz
1/25/2018
@sjahan,使用 for 循环,对象可能会更快。
0赞
Jamiec
1/25/2018
我个人总是会听从妮娜更好的知识;)除了这不会对部分进行第二级聚合
0赞
Nina Scholz
1/25/2018
@Jamiec,对不起,没有看到嵌套分组。
评论