我有一个对象数组
listOfItems: any[] = [
{text: 'Hola', group: 'espanian'},
{text: 'Hello', group: 'english'},
{text: 'How are you', group: 'english'},
{text: 'Tere', group: 'estonian'},
]
Run Code Online (Sandbox Code Playgroud)
我想迭代一个数组并使用分类对象创建另一个数组
groups: any[] = [
[
{ name: 'english',
items: [
{text: 'Hello', group: 'english'},
{text: 'How are you', group: 'english'},
]
},
{ name: 'espanian',
items: [
{text: 'Hola', group: 'espanian'}
]
},
{ name: 'estonian',
items: [
{text: 'Tere', group: 'estonian'}
]
},
]
Run Code Online (Sandbox Code Playgroud)
最有活力的方法是什么?组的数量可能超过 30 个,所以我想避免在循环内进行 if 或 equals 检查
我的意思是动态 - 基本上没有任何显式检查,例如 item.group = 'english'
我试图实现类似的目标
let result: any = [];
this.listOfItems.forEach(p => {
var key = p.group;
result[key] = result[key] || [];
result[key].push(p);
})
Run Code Online (Sandbox Code Playgroud)
但结果并不完全是我想要的
[
{'english': [
{text: 'Hello', group: 'english'},
{text: 'How are you', group: 'english'},
]
},
{'espanian': [
{text: 'Hola', group: 'espanian'},
]
},
]
Run Code Online (Sandbox Code Playgroud)
any[]?interface Item {
text: string;
group: string;
}
interface Categorized {
name: string;
items: Item[];
}
const itemList: Item[] = [
{ text: 'Hola', group: 'espanian' },
{ text: 'Hello', group: 'english' },
{ text: 'How are you', group: 'english' },
{ text: 'Tere', group: 'estonian' },
];
const categorize = (list: Item[]): Categorized[] => {
const map: Record<string, Categorized> = {};
list.forEach((item) => {
if (!map[item.group]) {
map[item.group] = { name: item.group, items: [item] };
return;
}
map[item.group].items.push(item);
});
return Object.values(map);
};
console.log(categorize(itemList));
Run Code Online (Sandbox Code Playgroud)
我们只使用一个循环。
编译:
interface Item {
text: string;
group: string;
}
interface Categorized {
name: string;
items: Item[];
}
const itemList: Item[] = [
{ text: 'Hola', group: 'espanian' },
{ text: 'Hello', group: 'english' },
{ text: 'How are you', group: 'english' },
{ text: 'Tere', group: 'estonian' },
];
const categorize = (list: Item[]): Categorized[] => {
const map: Record<string, Categorized> = {};
list.forEach((item) => {
if (!map[item.group]) {
map[item.group] = { name: item.group, items: [item] };
return;
}
map[item.group].items.push(item);
});
return Object.values(map);
};
console.log(categorize(itemList));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1926 次 |
| 最近记录: |