javascript - 删除重复的对象

标签 javascript jquery

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/

有什么想法吗?谢谢!

最佳答案

为了解决您的更新问题,下面是保留第一个重复元素的代码:

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

关于javascript - 删除重复的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18590076/

相关文章:

javascript - Google DoubleClick for Publishers 失败得太悄无声息

javascript - 在javascript中包装函数

javascript - 追加后删除并不是删除

php - 这个数据库调用有什么问题?

javascript - 如何在 jQuery 中响应 ul li 点击

javascript - 上传函数没有被 ng-file-select 调用

javascript - 尝试使用 Eclipse 的 Chrome 调试器调试 NodeJ 时“无法获取调试选项卡”

javascript - 通过 Ajax 请求发送后无法解析 JSON

javascript - 在尝试再次执行之前等待函数完成执行的问题

javascript - jquery 自动点击底层元素