2017-02-13 6 views
1

У меня есть два разных объектазначения суммы два различных объектов

var objA = { a: 10, b: 20, c: 30 }; var objB = { a: 3, c: 6, d: 3 }; 

и я хочу суммировать их значение, как в этом примере ниже

{ a: 13, b: 20, c: 36, d: 3 } 
+0

что вы пробовали? –

+0

@VilasKumkar Я пробовал с ** для ** в цикле ** с комбинацией ** Object.keys() ** .... Но только результат, который я получил, суммирует все из них, я имею в виду, что я получил 72 – Furious

ответ

4

Использования Array#reduce методы

var objA = { 
 
    a: 10, 
 
    b: 20, 
 
    c: 30 
 
}; 
 
var objB = { 
 
    a: 3, 
 
    c: 6, 
 
    d: 3 
 
}; 
 

 
console.log(
 
    // concatenate keys array 
 
    Object.keys(objA).concat(Object.keys(objB)) 
 
    // or use Object.keys(Object.assign({},objA,objB)) 
 

 
    // iterate to generate the object 
 
    .reduce(function(obj, k) { 
 
    // define object property, treat as 0 if not defined 
 
    obj[k] = (objA[k] || 0) + (objB[k] || 0); 
 
    // return object difference 
 
    return obj; 
 
    // set initial value as an empty object 
 
    }, {}) 
 
)


Или намного лучший способ, определяя начальное значение как копию второго объекта.

var objA = { 
 
    a: 10, 
 
    b: 20, 
 
    c: 30 
 
}; 
 
var objB = { 
 
    a: 3, 
 
    c: 6, 
 
    d: 3 
 
}; 
 

 
console.log(
 
    // get property names array of objB 
 
    Object.keys(objA) 
 
    // iterate over array 
 
    .reduce(function(obj, k) { 
 
    // add value to existing property or update 
 
    obj[k] = (obj[k] || 0) + objA[k]; 
 
    // return object reference 
 
    return obj; 
 
    // define initial value as an object which holds 
 
    // all the property and value in objB 
 
    }, Object.assign({}, objB)) 
 
)

+1

Да, это то, что мне нужно. Хорошее решение ... Приветствия – Furious

2

var objA = { a: 10, b: 20, c: 30 }; var objB = { a: 3, c: 6, d: 3 }; 
 
var objC = {} 
 
for (key in objA) { 
 
\t if (objB.hasOwnProperty(key)) { 
 
\t \t objC[key] = objA[key] + objB[key] 
 
    } else { 
 
    \t objC[key] = objA[key] 
 
    } 
 
} 
 
for (key in objB) { 
 
\t if (!objC.hasOwnProperty(key)) { 
 
    if (objA.hasOwnProperty(key)) { 
 
     objC[key] = objA[key] + objB[key] 
 
    } else { 
 
     objC[key] = objB[key] 
 
    } 
 
    } 
 
} 
 
console.log(objC)

3

Использование lodash

function customizer(objValue, srcValue) { 
    if(objValue && srcValue) 
    return objValue+srcValue; 
} 

var objA = { a: 10, b: 20, c: 30 }; var objB = { a: 3, c: 6, d: 3 }; 

console.log(_.mergeWith(objA, objB, customizer)); 

Demo

0

Сортировка решение с использованием Object.assign() и Array.prototype.reduce() функции:

var objA = { a: 10, b: 20, c: 30 }, 
 
    objB = { a: 3, c: 6, d: 3}, 
 
    merged = Object.assign({}, objA, objB); 
 

 
var result = Object.keys(merged).reduce(function (r, k) { 
 
    r[k] = (merged[k] && objA[k] && objB[k])? merged[k] + objA[k] : merged[k]; 
 
    return r; 
 
}, {}); 
 

 
console.log(result);

1

мне очень нравится второе решение Пранав С Balan. Но я трачу немного времени, поэтому также отправляю свое решение :).

var objA = { a: 10, b: 20, c: 30 }; 
var objB = { a: 3, c: 6, d: 3 }; 


let params = Array.from(new Set(Object.keys(objA).concat(Object.keys(objB)))); 
let sum = params.map(param => (objA[param] || 0) + (objB[param] || 0)); 

console.log(params, sum);