2013-09-03 2 views
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/

Любые идеи? Благодаря!

+0

что, если есть {"a": 15} и {"a": 16}, это будет считаться дубликатом? – trrrrrrm

+1

Кажется довольно простым, иди беспорядок своими руками с помощью некоторых петель! – moonwave99

+0

Возможно, вы захотите прочитать это http://stackoverflow.com/questions/2218999/remove-duplicates-from-an-array-of-objects-in-javascript?rq=1 –

ответ

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 
+0

Я думал, что это работает, пока я не добавил еще несколько значений объекту; http://jsfiddle.net/GTpgA/40/ – JustMe

+0

@Isaac Можете ли вы обновить вопрос своими новыми входными данными и ожидаемым результатом? – phant0m

+0

@ phant0m Хорошо ... извините за путаницу. – JustMe

0

В примере, который вы разместили underscore.js, используется библиотека. посмотрите здесь документы link.

уник _.uniq (массив, [isSorted], [итератор])

Alias: уникальный Производит дубликат версию без массива, используя === для проверки объекта равенства. Если вы заранее знаете, что массив отсортирован, передача true для isSorted будет выполнять гораздо более быстрый алгоритм. Если вы хотите вычислить уникальные элементы на основе преобразования, передайте функцию итератора.

Использование его может сэкономить ваше время.

Там вы найдете пример, опираясь на чистый JavaScript: Remove Duplicates from JavaScript Array

посмотреть на thg435 ответ.

+1

_.unq() отлично работает, но не на объектах. Это было одно из первых решений, которые я пробовал. – JustMe

+0

@ Исаак Нет, это совсем не то, что вы хотите от своего описания, потому что вы хотите, чтобы все * удаленные дубликаты удалялись. – phant0m

+0

@ Исаак действительно ?? – lexeme

0

почему не у попробовать это для простых вычислений part..This только и хотят расчет, не считая дублирующих value..Its объекта не подходит для чистых связанных объектов манипуляций

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); 
Смежные вопросы