2017-02-27 99 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);

相关问题