2 回答
TA贡献1818条经验 获得超8个赞
您可以Array#reduce与对象一起使用来存储每个名称的对象。
var arr = [
{'name': 'b', 'version': '103', 'count': 10},
{'name': 'a', 'version': '0.1b', 'count': 73},
{'name': 'b', 'version': '109', 'count': 67},
{'name': 'a', 'version': '1.0.3', 'count': 100},
{'name': 'a', 'version': '2.1.0', 'count': 100},
{'name': 'c', 'version': 'a103', 'count': 30},
{'name': 'c', 'version': 'a111', 'count': 100}
];
const res = Object.values(arr.reduce((acc,{name, version, count})=>{
if(!acc[name] || acc[name] &&
(acc[name].count < count
|| acc[name].count === count && acc[name].version < version)){
acc[name] = {name, version, count};
}
return acc;
}, {}));
console.log(res);
TA贡献1876条经验 获得超7个赞
看来您在第二种情况下想要做的是聚合count具有相同name和的条目的属性version(类似于数据库中的COUNT+GROUP BY查询SQL)。
在这种情况下,您可以首先在第一级计算dictionary_res索引,然后在第二级计算索引:nameversion
dictionary_res = arr2.reduce((acc, { name, version, count }) => {
if (!acc[name] || (acc[name] && !acc[name][version])) {
acc[name] = acc[name] || {}
acc[name][version] = { count: count }
} else {
acc[name][version]['count'] = acc[name][version]['count'] + count
}
return acc
}, {})
dictionary_res产生一个非常接近您想要的值:
{
a: { '0.1': { count: 1 } },
b:
{ '209': { count: 2 }, '213': { count: 2 }, '216': { count: 5 } }
}
但是,您仍然需要将其转换为数组才能完全实现您想要的:
array_res = Object.keys(dictionary_res).reduce((acc, name) => {
Object.keys(dictionary_res[name]).forEach((version) => (
acc.push({ name, version, count: dictionary_res[name][version]['count'] })
))
return acc
}, [])
array_res现在产生预期值:
[ { name: 'a', version: '0.1', count: 1 },
{ name: 'b', version: '209', count: 2 },
{ name: 'b', version: '213', count: 2 },
{ name: 'b', version: '216', count: 5 } ]
添加回答
举报