我有一个需要过滤的对象数组。 对象结构如下:
[
{
name: 'Wheat',
group: { name: 'Grains' }
}, {
name: 'Rice',
group: { name: 'Grains' }
}, {
name: 'corn',
group: { name: 'Grains' }
}, {
name: 'Oats',
group: { name: 'Grains' }
}, {
name: 'Live Cattle',
group: { name: 'Livestock/meat products' }
}, {
name: 'pork Bellies',
group: { name: 'Livestock/meat products' }
}
]
我需要类似这样的东西才能在GUI上显示它。 根据他们的组名分离出数组。由于组名将是唯一的,但是每个组下都可以有多个选择。
因此,我想创建一个HashMap,其键为组名,值为名。 HashMap如下所示:
{
'Grains': 'Oats',
'Grains': 'Wheat',
'Grains': 'corn',
'Livestock/meat products': 'Live Cattle',
'Livestock/meat products': 'pork Bellies'
}
如何使用数组函数来实现此目的,或者需要使用单独的逻辑来创建HashMap?
谢谢
答案 0 :(得分:0)
您不能生成具有重复键的Map。因此,您可以替换键和值,然后就可以了,例如:
const
data = [
{
name: 'Wheat',
group: { name: 'Grains' }
}, {
name: 'Rice',
group: { name: 'Grains' }
}, {
name: 'corn',
group: { name: 'Grains' }
}, {
name: 'Oats',
group: { name: 'Grains' }
}, {
name: 'Live Cattle',
group: { name: 'Livestock/meat products' }
}, {
name: 'pork Bellies',
group: { name: 'Livestock/meat products' }
}
],
result = data.map(({ name, group }) => [name, group.name]),
resultAsMap = new Map(result);
或者,如果有帮助,您可以创建一组字符串,例如:
result = new Set(data.map(({ name, group }) => `${group.name}: ${name}`));
您也可以按照您的情况进行“分组依据”:
reducer = (map, { name, group }) => map.set(group.name, (map.get(group.name) || []).concat(name)),
result = data.reduce(reducer, new Map);
答案 1 :(得分:0)
这是完美的方法。调用此函数时传递数据。
function formatData(data) {
const formattedData = {}
data.forEach(({name, group}) => {
formattedData[group.name] = formattedData[group.name] ? formattedData[group.name].concat(name) : [name];
});
return formattedData;
}