![](/img/trans.png)
[英]Using map with reduce in javascript to filter objects in an array
[英]Print from nested array using map, reduce and filter in javascript
最終目的是為以下數組中的每個名稱獲取一個。 (就像下面片段底部的注釋行)
如果有相同的名字,只有最大的一個,如果有重復的,只有一個更高版本的。
我嘗試使用map的組合,減少。 請幫我解決這個問題。
//Original array
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}
];
//expected console output
// { name: 'a', version: '2.1.0', count: 100 }
// { name: 'b', version: '109', count: 67 }
// { name: 'c', version: 'a111', count: 100 }
首先,作為該過程的“一部分”,我試圖從數組中獲取“a”。
var filteredArr = arr.filter(item => item.name === 'a');
var m = Math.max(...(filteredArr.map(({count}) => count))),
maxes = arr.map(({count}) => count).reduce((p,c,i,a) => c == m ? p.concat(i) : p,[]);
console.log(maxes);
我希望從上面得到 [3, 4],但它會打印 [3, 4, 6]。
=====
附加問題:
我該如何處理另一個原件到預期的原件。
//Another original array.
var arr2 = [
{ name: 'a', version: '0.1', count: 1 },
{ name: 'b', version: '216', count: 1 },
{ name: 'b', version: '209', count: 1 },
{ name: 'b', version: '216', count: 1 },
{ name: 'b', version: '216', count: 1 },
{ name: 'b', version: '213', count: 1 },
{ name: 'b', version: '213', count: 1 },
{ name: 'b', version: '209', count: 1 },
{ name: 'b', version: '216', count: 1 },
{ name: 'b', version: '216', count: 1 }
];
//expected output
// { name: 'a', version: '0.1', count: 1 },
// { name: 'b', version: '216', count: 5 },
// { name: 'b', version: '209', count: 2 },
// { name: 'b', version: '213', count: 2 }
您可以使用Array#reduce
和 object 來存儲每個名稱的 object。
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);
在第二種情況下,您似乎想要為具有相同name
和version
的條目聚合count
屬性(類似於SQL
數據庫中的COUNT
+ GROUP BY
查詢)。
在這種情況下,您可以首先在第一級計算按name
索引的dictionary_res
,在第二級按version
索引:
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 } ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.