将一个对象的值和属性合并到另一个对象中

我有两个单独的对象:

对象1

var obj1 = { features: { "1234": { "price": 0 }, "1235": { "price": 0 } } }; 

对象2

 var obj2 = { features: { "1234": { "price": 1000, "property": "val" }, "1235": { "price": 500, "property": "val" } } }; 

我想将Object 1的price属性设置为两个对象中键(1234,1235等)匹配的Object 2的price属性的值。

此外,我想知道如何添加一个新的属性从对象2 对象1

最后我想让对象3看起来像:

 var obj3 = { features: { "1234": { "price": 1000, "property": "val" }, "1235": { "price": 500, "property": "val" } } }; 

我已经尝试了以下,但必须有一个更好的方法是有效的?

 var obj3 = {}; for (key in obj1) { if (obj1.hasOwnProperty(key)) { var val = obj1[key]; if (typeof val === 'object') { for (obj1_key in val) { if (val.hasOwnProperty(obj1_key)) { if (obj1_key === 'price') { // set value to value of obj2 price property } // add a new property to object #3 obj3[obj1_key]['property'] = 'value_of_object_2_property'; } } } // add to new object #3 obj3[key] = val; } } 

我知道有库帮助这种事情,如下划线,所以如果你有如何实现与下划线或lodash我打开任何build议的build议。

你可以用lodash做。 在这两种解决scheme中,您可以使用_.pluck函数从obj2提取任何字段。

解决scheme1,用obj1字段循环:

 var obj3 = { features: {} }; _(obj1.features) .keys() .each(function(id) { var price = ob2.prices[id]; if (price) { obj3.features[id] = _.pick(price, ['price', 'property']); } }) .value(); 

解决scheme2,使用reduce函数:

 var obj3 = _.reduce(ob1.feature, function(result, value, id) { var price = ob2.prices[id]; if (price) { result.features[id] = _.pick(price, ['price', 'property']); } return result; }, { features: {}}); 

使用_.merge

此方法与_.assign类似,不同之处在于它recursion地将源对象的自身和inheritance的可枚举string键控属性合并到目标对象中。 如果目标值存在,则跳过parsing为未定义的源属性。 数组和纯对象属性是recursion合并的。其他对象和值types被赋值覆盖。 源对象从左到右应用。 后续来源将覆盖以前来源的属性分配。

 var obj1 = { features: { "1234": { "price": 0 }, "1235": { "price": 0 } } }; var obj2 = { features: { "1234": { "price": 1000, "property": "val" }, "1235": { "price": 500, "property": "val" } } }; var obj3 = {}; _.merge(obj3,obj1,obj2); document.getElementById('result').innerHTML = JSON.stringify(obj3,null,2); console.log(obj3); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.10.0/lodash.min.js"></script> <pre id='result'></pre>