2
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/

有任何想法吗?谢谢!

4

3 回答 3

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
于 2013-09-03T10:52:30.307 回答
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);
于 2013-09-03T15:14:58.913 回答
0

在您发布的示例underscore.js中,使用了库。看看这里的文档链接

uniq _.uniq(array, [isSorted], [iterator])

Alias: unique 产生一个无重复版本的数组,使用 === 来测试对象是否相等。如果您事先知道数组已排序,则为 isSorted 传递 true 将运行更快的算法。如果要基于转换计算唯一项,请传递迭代器函数。

使用它可以节省您的时间。

在那里你会找到依赖于干净 javascript 的示例:Remove Duplicates from JavaScript Array

看看thg435的答案。

于 2013-09-03T10:41:47.817 回答