我的意见如下
[
{
"metadata": { "id": 1071, "name": "First" },
"languages": [
{ "name": "Alpha", "details": [ { "city": "usa", "count": 33 } ] },
{ "name": "Beta", "details": [ { "city": "japan", "count": 3 } ] },
]
},
{
"metadata": { "id": 1068, "name": "Second" },
"languages": [
{ "name": "Alpha", "details": [ { "city": "japan", "count": 10 }, { "city": "usa", "count": 20 } ] },
{ "name": "Beta", "details": [ { "city": "japan", "count": 15 }, { "city": "usa", "count": 25 } ] },
]
},
]
这是我必须按语言Alpha过滤的场景.因此,我必须通过Alpha判断第一个对象和过滤器语言,然后将USA和Japan计数到一个新数组中.类似地,循环第二个对象并提取该计数.
最后,我应该得到新数组中的计数序列
output = { japan: [0, 10], usa: [33, 20] } //for filter by Alpha
output = { japan: [3, 15], usa: [0, 25] } //for filter by Beta
我能够通过使用下面的代码实现上述输出.
const filterBy = (data, name) => {
return data.reduce((p, c) => {
for (let langObj of c.languages) {
if (langObj.name === name) {
const groupedOnCityCount = langObj.details.reduce((x, {city,count}) => ({ ...x, [city]: count }), {});
p.usa.push(groupedOnCityCount?.usa || 0);
p.japan.push(groupedOnCityCount?.japan || 0);
}
}
return p;
}, { japan: [], usa: [] });
}
const A = filterBy(data, 'Alpha');
const B = filterBy(data, 'Beta');
到目前为止,一切都运转良好.如果输入是动态的,问题就会出现.即,我们不知道输出是否只包括japan
和usa
(不是静态的)
这是我现在期望的动态输入,而不是早期的静态输入.
[
{
"metadata": { "id": 1071, "name": "First" },
"languages": [
{ "name": "Alpha", "details": [ { "city": "usa", "count": 33 }, { "city": "korea", "count": 20 } ] },
{ "name": "Beta", "details": [ { "city": "japan", "count": 3 } ] },
]
},
{
"metadata": { "id": 1068, "name": "Second" },
"languages": [
{ "name": "Alpha", "details": [] },
{ "name": "Beta", "details": [ { "city": "japan", "count": 15 }, { "city": "russia", "count": 77 } ] },
]
},
]
根据上述输入,大约languages
个可能包含其他对象中不存在的额外城市.还有一些可能有空的details:[]
对于上述输入,我想要所需的输出
output = { usa: [33, 0] korea: [20, 0 ] } //for filter by Alpha
output = { japan: [3, 15], russia: [0, 77] } //for filter by Beta
有人能告诉我如何动态获取这个吗?