var foo = [ { "a" : 15 }, { "b" : 25 }, { "a" : 15 }, {"c" : 13},{"c" : 13},{"c" : 13},{ "b" : 25 } ];
我想删除重复项,然后总结剩下的内容。所以上面会产生,
{ "a" : 15 },{ "b" : 25 }, {"c" : 13},
当我添加剩下的值时,给我53
。
我在这里看到了类似的内容(Removing duplicate objects with Underscore for Javascript),但并不清楚如何删除重复项。
我找到了以下解决方案,但它对我不起作用。 http://bateru.com/news/2012/03/code-of-the-day-get-unique-objects-from-an-array-of-json-objects/
有什么想法吗?谢谢!
答案 0 :(得分:4)
为了解决您的更新,这里的代码保留了第一个重复的元素:
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
答案 1 :(得分:0)
在示例中,您使用了underscore.js
库。请查看此处的文档link。
uniq _.uniq(array,[isSorted],[iterator])
别名:独特 生成数组的无副本版本,使用===来测试对象相等性。如果您事先知道数组已排序,则为isSorted传递true将运行更快的算法。如果要根据转换计算唯一项,请传递迭代器函数。
使用它可以节省您的时间。
在那里你会找到依赖干净的javascript的例子:Remove Duplicates from JavaScript Array
查看 thg435 回答。
答案 2 :(得分:0)
为什么不尝试这个简单的计算部分。这只是你想要通过不考虑重复的对象值进行计算..它不适合纯对象相关的操作
var array = [{ "a" : 15 }, { "b" : 25 }, { "a" : 15 }, {"c" : 13}];
var finVal=0;
var items = {};
var keys={};
for(var i=0;i<array.length;i++){
for(var key1 in array[i]){
if(items[key1]==undefined ){
items[key1] =array[i][key1];
var locVal = items[key1];
finVal = finVal+locVal;
} else {
//items[key1] =array[i][key1];
var locVal = items[key1];
finVal = finVal-items[key1];
}
}
}
console.log(finVal);