これが私が考えていることです:
オブジェクトの配列が与えられた場合:
[
{
"name": "Kirk",
"count": 1
},
{
"name": "Spock",
"count": 1
},
{
"name": "Kirk",
"count": 1
}
]
私は取得しようとしています:
[
{
"name": "Kirk",
"count": 2
},
{
"name": "Spock",
"count": 1
}
]
おそらくこれを達成するためにいくつかの高次関数を組み合わせたアルゴリズムが既にあるかどうか疑問に思っています。これはループで簡単に実行できますが、高階関数を使用して解決する方法を探しています。誰かがこれを達成するために何を使用すべきかを教えてくれたら、それは素晴らしいことです. 繰り返しますが、私はできるだけ洗練されたものを探しています(2 つのマップとフィルターは、ループからの大きな改善にはなりません)。
これが私の現在の解決策であり、より良いものを探しています(より良いとは、より表現力豊かであることを意味します):
function mergeDuplicates(input) {
var output = [];
var existingItem = null;
input.forEach(function (inputItem) {
existingItem = _.find(output, function (outputItem) {
return inputItem.name === outputItem.name;
});
existingItem ? existingItem.count += 1 : output.push({
name: inputItem.name,
count: 1
});
existingItem = null;
});
return output;
}
行番号 10 をより明確にするために: 元の配列では、count
存在しないか 1 である可能性があるため、1 に設定します。