这是我的想法:
给定一个对象数组:
[
{
"name": "Kirk",
"count": 1
},
{
"name": "Spock",
"count": 1
},
{
"name": "Kirk",
"count": 1
}
]
我试图得到:
[
{
"name": "Kirk",
"count": 2
},
{
"name": "Spock",
"count": 1
}
]
我想知道是否已经有一种算法,也许结合了一些高阶函数来实现这一点。我可以用循环轻松地做到这一点,但我正在寻找一种使用高阶函数来解决它的方法。如果有人能指出我应该用什么来实现这一点,那就太好了。同样,我正在寻找尽可能优雅的东西(两个地图和一个过滤器不会对循环有很大的改进)。
这是我目前的解决方案,我正在寻找更好的东西(更好的意思是更具表现力):
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。