Javascript 删除重复对象

Javascript 删除重复对象,javascript,jquery,Javascript,Jquery,我想删除重复的内容,然后总结剩下的内容。因此,上述情况将发生变化 var foo = [ { "a" : 15 }, { "b" : 25 }, { "a" : 15 }, {"c" : 13},{"c" : 13},{"c" : 13},{ "b" : 25 } ]; 当我添加剩下的值时,给我53 我在这里看到了类似的内容(),但不太清楚如何删除重复项 我找到了以下解决方案,但它对我不起作用。 有什么想法吗?谢谢 在您发布的示例中,使用了下划线.js库。看看这里的文件 uniquniq(

我想删除重复的内容,然后总结剩下的内容。因此,上述情况将发生变化

var foo = [ { "a" : 15 }, { "b" : 25 }, { "a" : 15 }, {"c" : 13},{"c" : 13},{"c" : 13},{ "b" : 25 }  ];
当我添加剩下的值时,给我
53

我在这里看到了类似的内容(),但不太清楚如何删除重复项

我找到了以下解决方案,但它对我不起作用。


有什么想法吗?谢谢

在您发布的示例中,使用了
下划线.js
库。看看这里的文件

uniquniq(数组,[isSorted],[iterator])

别名:unique 使用===测试对象相等性,生成数组的重复自由版本。如果您事先知道数组已排序,那么为isSorted传递true将运行更快的算法。如果要基于转换计算唯一项,请传递迭代器函数

使用它可以节省你的时间

在这里,您可以找到依赖干净javascript的示例:


查看thg435答案。

在您发布的示例中,使用了
下划线.js
库。看看这里的文件

uniquniq(数组,[isSorted],[iterator])

别名:unique 使用===测试对象相等性,生成数组的重复自由版本。如果您事先知道数组已排序,那么为isSorted传递true将运行更快的算法。如果要基于转换计算唯一项,请传递迭代器函数

使用它可以节省你的时间

在这里,您可以找到依赖干净javascript的示例:


查看thg435答案。

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

{ "a" : 15 },{ "b" : 25 }, {"c" : 13},
uniqBy
定义如下:

让我们试试这个:

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 })
其思想是首先收集密钥,然后在数组中迭代,忽略多次出现的密钥(
indexOf
!=
lastIndexOf

如果数组很大(>5000项),使用哈希表而不是
indexOf
可能更有效:

> 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

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

{ "a" : 15 },{ "b" : 25 }, {"c" : 13},
uniqBy
定义如下:

让我们试试这个:

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 })
其思想是首先收集密钥,然后在数组中迭代,忽略多次出现的密钥(
indexOf
!=
lastIndexOf

如果数组很大(>5000项),使用哈希表而不是
indexOf
可能更有效:

> 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

你为什么不试试这个简单的计算部分呢这只是你想通过不考虑重复的对象值来计算它不适合纯对象相关的操作

> 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

你为什么不试试这个简单的计算部分呢这只是你想通过不考虑重复的对象值来计算它不适合纯对象相关的操作

> 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

如果有{“a”:15}和{“a”:16}会被算作重复吗?看起来很简单,去用一些环弄乱你的手吧!你可能想读这篇文章,不,{a:15}和{a:16}不会被计算为重复的。如果有{a:15}和{a:16}会被计算为重复的吗?看起来很简单,去用一些环弄乱你的手吧!您可能想读一下这篇文章,不,{“a”:15}和{“a”:16}将不被视为重复项u.unq()非常有效,但对对象无效。这是我第一次尝试的解决方案之一。@Isaac不,这根本不是你想从你的描述中得到的,因为你想删除所有重复出现的地方。@Phantom你是对的,这不是我想要的。我意识到当我添加更多的对象时。_uq.unq()非常有效,但对对象无效。这是我第一次尝试的解决方案之一。@Isaac不,这根本不是你想从你的描述中得到的,因为你想删除所有重复出现的地方。@Phantom你是对的,这不是我想要的。我意识到当我添加更多的对象时。我以为这是可行的,直到我向对象添加了更多的值@Isaac你能用新输入的数据和预期的结果更新问题吗?@phant0m好的……很抱歉搞混了。@thg435我做错了什么?警报没有发出。。我以为这是可行的,直到我向对象添加了更多的值@Isaac你能用新输入的数据和预期的结果更新问题吗?@phant0m好的……很抱歉搞混了。@thg435我做错了什么?警报没有发出。。