2016-03-01 42 views
5

Mam tablicę z szeregu obiektów z pasującymi kluczami:Dodaj wartości dopasowanych kluczy w tablicy obiektów

[{a: 2, b: 5, c: 6}, {a:3, b: 4, d:1},{a: 1, d: 2}] 

Chcę pętli tablicy i jeśli klucze pasujące chcę dodać wyniki każdego z nich i zwróć jeden obiekt sumą każdego klucza.

tj

{a: 6, b: 9, c: 6, d: 3} 

Kod Obecnie mam to

function combine() { 
    var answer = []; 
    for(var i in arguments){ 
    answer.push(arguments[i]) 
    } 

answer.reduce(function(o) { 
    for (var p in o) 
     answer[p] = (p in answer ? answer[p] : 0) + o[p]; 
     return answer; 
    }, {}); 
} 

mogę znaleźć odpowiedź here gdybym był do korzystania z biblioteki podkreślenia, jednak chciałbym to zrobić bez korzystania z biblioteki . Myślę, że mam trudności ze zrozumieniem, w jaki sposób działa metoda reduce - Każda pomoc, jak rozwiązać ten problem, byłaby bardzo doceniana. Ponadto uważam, że jest to odpowiedź, która powinna być gdzieś na SO bez konieczności korzystania z biblioteki.

Z góry dziękuję.

+0

wspomnieć także wyjście otrzymujesz rn. –

Odpowiedz

1

Przeprowadź pętle przez każdy obiekt i dodaj go.

var a = [{a: 2, b: 5, c: 6}, {a:3, b: 4, d:1},{a: 1, d: 2}]; 
 
    var ans = {}; 
 

 
    for(var i = 0; i < a.length; ++i){ 
 
     for(var obj in a[i]){ 
 
     ans[obj] = ans[obj] ? ans[obj] + a[i][obj] : a[i][obj]; 
 
     } 
 
    } 
 
document.write(JSON.stringify(ans));


ans[obj] = ans[obj] ? ans[obj] + a[i][obj] : a[i][obj]; 

This line is the same as  
// check if the object already exists(or not falsy) in answer, if Yes add that value to the new value 
if(ans[obj]) 
{ 
    ans[obj] = ans[obj] + a[i][obj]; 
} 
// else create a new object in the answer and set it to the value from the array 
else 
{ 
    ans[obj] = a[i][obj]; 
} 
+0

dzięki, to zadziałało. Jednak jestem nieco zdezorientowany tą linią 'ans [obj] = ans [obj]? ans [obj] + a [i] [obj]: a [i] [obj]; '. Czy mógłbyś wyjaśnić w swojej odpowiedzi? –

1

spróbować tej

resobj = {}; 
 
[{a: 2,b: 5,c: 6}, {a: 3,b: 4,d: 1}, {a: 1,d: 2}].forEach(function(v) { 
 

 
    var keys = Object.keys(v); 
 
    for (i = 0; i < keys.length; i++) { 
 
    if (typeof resobj[keys[i]] == 'undefined') { 
 
     resobj[keys[i]] = Number(v[keys[i]]); 
 
    } else { 
 
     resobj[keys[i]] += v[keys[i]]; 
 
    } 
 
    } 
 

 
}) 
 

 
document.write(JSON.stringify(resobj))

1

Yo ur funkcja zwrotna w reduce() potrzebuje dwa argumenty:

  1. Wynik powrócił do poprzedniej wartości (lub wartości początkowej jeśli pierwszy)
  2. Aktualna wartość w pętli

Powinieneś także przekazać pusty obiekt jako drugi parametr do zmniejszenia. . Jest to jeden będzie wypełnić

var input = [ 
 
    {a: 2, b: 5, c: 6}, 
 
    {a: 3, b: 4, d: 1}, 
 
    {a: 1, d: 2} 
 
]; 
 

 
var answer = input.reduce(function(prev, curr) { 
 
    for (var p in curr) { 
 
     prev[p] = (prev[p] || 0) + curr[p]; 
 
    } 
 

 
    return prev; // this will be passed as prev in the next iteration or returned as the result. 
 
}, {}); // The {} is the initial value passed as prev 
 

 
console.log(answer);

0

Jeszcze innym rozwiązaniem ze zmniejszenia:

var result = [{a: 2, b: 5, c: 6}, {a:3, b: 4, d:1},{a: 1, d: 2}].reduce(function(prev, current) { 
 
    Object.keys(current).forEach(function(key) { 
 
     prev[key] = (prev[key] || 0) + current[key]; 
 
    }); 
 
    return prev; 
 
}, {}); 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 2) + '</pre>');

0

Wystarczy użyć Array#forEach() i obiekt dla wyniku .

var data = [{ a: 2, b: 5, c: 6 }, { a: 3, b: 4, d: 1 }, { a: 1, d: 2 }], 
 
    obj = {}; 
 

 
data.forEach(function (o) { 
 
    Object.keys(o).forEach(function (k) { 
 
     obj[k] = (obj[k] || 0) + o[k]; 
 
    }); 
 
}) 
 
document.write('<pre>' + JSON.stringify(obj, 0, 4) + '</pre>');

2

Korzystanie Array.reduce() i Array.map()

var tab = [{a: 2, b: 5, c: 6}, {a:3, b: 4, d:1},{a: 1, d: 2}]; 

function sum(tab) { 
    return tab.reduce((a, b) => { 
    Object.keys(b).map(c => a[c] = (a[c] || 0) + b[c]); 
    return a; 
    }); 
} 

console.log(sum(tab)); 
Powiązane problemy