将一个对象的值和属性合并到另一个对象中
我有两个单独的对象:
对象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>