我有两个独立的对象:
对象1
var obj1 = {
features: {
"1234": {
"price": 0
},
"1235": {
"price": 0
}
}
};
对象2
var obj2 = {
features: {
"1234": {
"price": 1000,
"property": "val"
},
"1235": {
"price": 500,
"property": "val"
}
}
};
我想将对象1 的价格属性设置为对象2 的价格属性值,其中键(1234,1235等)匹配在两个对象中。
此外,我想知道如何从对象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实现这一点的建议,我会接受任何建议。
答案 0 :(得分:2)
你可以用lodash做到这一点。在这两种解决方案中,您可以使用obj2
函数从_.pluck
中提取任何字段。
解决方案1,使用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();
解决方案2,使用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: {}});
答案 1 :(得分:0)
使用_.merge
此方法与_.assign类似,不同之处在于它以递归方式将源对象的自身和继承的可枚举字符串键控属性合并到目标对象中。如果存在目标值,则跳过解析为未定义的源属性。数组和普通对象属性以递归方式合并。其他对象和值类型由赋值覆盖。源对象从左到右应用。后续来源会覆盖以前来源的属性分配。
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>