2017-02-27 129 views
-1

我有多個JavaScript對象使用Javascript - 具有相同的屬性

{ a:12, 
    b:8, 
    c:17 
} 

而且

{ a:2, 
    b:4, 
    c:1 
} 

我需要通過按鍵來概括這種兩個物體的兩個對象的總和

結果:

{ a:14, 
    b:12, 
    c:18 
} 

你有沒有JavaScript中的ny解決方案? 我用Object.keys.map但爲時較長時間,因爲我有一個100個元素在我的對象

感謝您幫助

+0

只是兩個對象? –

+0

沒有多重抱歉,我正確 –

+1

@LionelB如果多個,那麼你必須存儲一個數組。 –

回答

6

您可以使用減少的是,下面爲你想要的功能需要儘可能多的對象和重點對其求和:

var obj1 = { 
 
    a: 12, 
 
    b: 8, 
 
    c: 17 
 
}; 
 

 
var obj2 = { 
 
    a: 12, 
 
    b: 8, 
 
    c: 17 
 
}; 
 

 
var obj3 = { 
 
    a: 12, 
 
    b: 8, 
 
    c: 17 
 
}; 
 

 

 
function sumObjectsByKey(...objs) { 
 
    return objs.reduce((a, b) => { 
 
    for (let k in b) { 
 
     if (b.hasOwnProperty(k)) 
 
     a[k] = (a[k] || 0) + b[k]; 
 
    } 
 
    return a; 
 
    }, {}); 
 
} 
 

 
console.log(sumObjectsByKey(obj1, obj2, obj3));

0

試試這個。

let t1 = 
{ 
    a:12, 
    b:8, 
    c:17 
}; 

let t2 = 
{ 
    a:2, 
    b:4, 
    c:1 
}; 

function sum(ob1, ob2) { 
    let sum = {}; 

    Object.keys(ob1).forEach(key => { 
    if (ob2.hasOwnProperty(key)) { 
     sum[key] = ob1[key] + ob2[key] 
    } 
    }) 
    return sum; 
} 

sum(t1, t2); 

https://jsfiddle.net/fbnt2vhe/

0

如果對象擁有所有常用的鍵,您可以提前從一個對象中獲取鍵並迭代創建一個新的結果對象稍後從單個對象中獲取密鑰。

var o1 = { a: 12, b: 8, c: 17 }, 
 
    o2 = { a: 2, b: 4, c: 1 }, 
 
    keys = Object.keys(o1), 
 
    result = [o1, o2].reduce(function (r, o) { 
 
     keys.forEach(function (k) { 
 
      r[k] += o[k]; 
 
     }); 
 
     return r; 
 
    }, keys.reduce(function (r, k) { 
 
     r[k] = 0; 
 
     return r; 
 
    }, Object.create(null))); 
 
    
 
console.log(result);

1

一個稍微深一點,所有你想要的,只要對象是相等的!

const arr = [{ 
 
    a: 12, 
 
    b: { a: 12, c: { a: 12 } }, 
 
    c: 17 
 
    }, 
 
    { 
 
    a: 12, 
 
    b: { a: 12, c: { a: 12 } }, 
 
    c: 17 
 
    }, 
 
    { 
 
    a: 12, 
 
    b: { a: 12, c: { a: 12 } }, 
 
    c: 17 
 
    } 
 
]; 
 

 
const deepMergeSum = (obj1, obj2) => { 
 
    return Object.keys(obj1).reduce((acc, key) => { 
 
    if (typeof obj2[key] === 'object') { 
 
     acc[key] = deepMergeSum(obj1[key], obj2[key]); 
 
    } else if (obj2.hasOwnProperty(key) && !isNaN(parseFloat(obj2[key]))) { 
 
     acc[key] = obj1[key] + obj2[key] 
 
    } 
 
    return acc; 
 
    }, {}); 
 
}; 
 

 
const result = arr.reduce((acc, obj) => acc = deepMergeSum(acc, obj)); 
 
console.log('result: ', result);

相關問題