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 } ]
添加回答
舉報