问题描述
好吧,这就是我的想法。
我有两个示例对象
let obj1 = { x: 60 };
let obj2 = { x: 9 };
我想以这些对象的整数属性也将合并而不互相覆盖的方式合并这些对象,因此最终结果将是
let obj3 = { x: 69 };
因此,我研究了Object.assign,但是如果其他对象具有相同名称的属性并且不对整数属性求和,则此函数仅以对第一个对象的属性有利的方式合并属性。
我当然可以做一个循环遍历每个对象属性并创建一个具有汇总属性的新对象的函数,但是那会更长一些,我想知道是否已经有一个像Object这样的函数可以轻松地完成它.assign行为。
谢谢。
1楼
如果要使用Lodash
库,则可以通过mergeWith
方法执行此mergeWith
。
let obj1 = { x: 60, b: "foo", c: {y: 3, x: 'bar'} }; let obj2 = { x: 9, a: 'bar', c: {y: 4} }; const sum = _.mergeWith(obj1, obj2, (a, b) => { if (_.every([a, b], _.isNumber)) return a + b; }) console.log(sum)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script>
2楼
您可以通过获取任意数量的对象来减少对象,并通过尊重嵌套对象来减少键/值对。
const add = (...a) => a // take all parameters .map(Object.entries) // get entries .reduce((a, b) => [...a, ...b], []) // flat entries .reduce((o, [k, v]) => { o[k] = v && typeof v === 'object' // assign if object ? add(o[k] || {}, v) // result of recursive call : (o[k] || 0) + v; // or sum the value return o; }, {}); let obj1 = { x: 60, y: { z: 3 } }, obj2 = { x: 9, y: { z: 1, a: 32 } }, obj3 = { y: { a: 10 } }, result = add(obj1, obj2, obj3); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
3楼
像这样?
let obj1 = { x: 60 }; let obj2 = { x: 9 }; let obj3 = [obj1, obj2].reduce((s,a)=>{return {x: s.x+ax}}, {x:0}); console.log(obj3); // or more shortener: obj3 = {x:[obj1, obj2].reduce((s,a)=> s + ax,0)}; console.log(obj3); // for arbitrary properties, not just x: keys = Object.keys(obj1), obj3 = [obj1, obj2].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(obj3);