为了解决您的更新,这里的代码保留了第一个重复元素:
var foo = [ { "a" : 15 }, { "b" : 25 }, { "a" : 15 }, {"c" : 13} ];
uniqs = uniqBy(foo, JSON.stringify)
values = uniqs.map(function(x) { for(var k in x) return x[k] })
sum = values.reduce(function(a, b) { return a + b })
uniqBy
在这里定义:https ://stackoverflow.com/a/9229821/989121
让我们试试这个:
> var foo = [ { "a" : 15 }, { "b" : 25 }, { "a" : 15 }, {"c" : 13} ];
undefined
> fkeys = foo.map(function(x) { return Object.keys(x)[0] })
["a", "b", "a", "c"]
> sum = foo.reduce(function(s, x) {
var key = Object.keys(x)[0];
if(fkeys.indexOf(key) == fkeys.lastIndexOf(key))
s += x[key];
return s;
}, 0)
38
这个想法是首先收集键,然后遍历数组,忽略多次出现的键 ( indexOf
!= lastIndexOf
)。
如果您的数组很大(> 5000 个项目),使用哈希表而不是indexOf
可能更有效:
> fkeys = {}
Object {}
> foo.forEach(function(x) {
var key = Object.keys(x)[0];
fkeys[key] = (Number(fkeys[key]) || 0) + 1;
})
undefined
> sum = foo.reduce(function(s, x) {
var key = Object.keys(x)[0];
if(fkeys[key] === 1)
s += x[key];
return s;
}, 0)
38