我有一个类似下面的对象:
var obj1 = {
fparams: {
keys: ['a', 'b'],
pairs: {
'p': 'qwert'
}
},
qparams: {
'x': 'xyz'
}
}
另一个是:
var obj2 = {
fparams: {
keys: ['c', 'd'],
pairs: {
'q': 'yuiop'
}
},
qparams: {
'z': 'zyx'
}
}
如何将obj2
对象的属性添加到obj1
?
当我在Angular工作时,我尝试使用angular.merge(obj1,obj2)
但它没有合并keys数组,而是使用来自obj2
的键值覆盖它,但其余的属性会被合并。
这就是我最终想要的东西:
var obj2 = {
fparams: {
keys: ['a', 'b', 'c', 'd'],
pairs: {
'p': 'qwert',
'q': 'yuiop'
}
},
qparams: {
'x': 'xyz',
'y': 'zyx'
}
}
同样角度版本I使用角度1.5.8
编辑:结束使用lodash,因为它更容易使用和我以前没有意识到的大量功能。
答案 0 :(得分:3)
答案 1 :(得分:1)
使用lodash,您可以使用mergeWith
并创建所需的结果,因此当value为数组时,您需要连接值。
var obj1 = {"fparams":{"keys":["a","b"],"pairs":{"p":"qwert"}},"qparams":{"x":"xyz"}}
var obj2 = {"fparams":{"keys":["c","d"],"pairs":{"q":"yuiop"}},"qparams":{"z":"zyx"}}
var result = _.mergeWith(obj1, obj2, function(a, b) {
if(_.isArray(a)) return a.concat(b)
})
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
这是我尝试深度合并,使用递归,不确定它是否适用于所有数据结构。
var obj1 = {"fparams":{"keys":["a","b"],"pairs":{"p":"qwert"}},"qparams":{"x":"xyz"}}
var obj2 = {"fparams":{"keys":["c","d"],"pairs":{"q":"yuiop"}},"qparams":{"z":"zyx"}}
function merge(o1, o2) {
var result = {}
for (var i in o1) {
for (var j in o2) {
if (i == j && typeof o1[i] == 'object' && typeof o2[j] == 'object') {
if (Array.isArray(o1[i]) || Array.isArray(o2[j])) {
result[i] = Array.isArray(o1[i]) ? o1[i].concat(o2[j]) : o2[j].concat(o1[i])
} else {
result[i] = Object.assign(result[i] || {}, merge(o1[i], o2[j]))
}
}
if (typeof o1[i] != 'object' || typeof o2[j] != 'object') {
result[i] = o1[i]
result[j] = o2[j]
}
}
}
return result;
}
console.log(JSON.stringify(merge(obj1, obj2), 0, 4))
答案 2 :(得分:1)
我想简单地使用纯JS和递归函数mergeObjects
的帮助,您可以按照以下步骤进行操作;
function mergeObjects(o1,o2){
return Object.keys(o1)
.reduce(function(r,k){
o1[k] = Array.isArray(o1[k]) ? o1[k].concat(o2[k])
: typeof o1[k] === "object" ? mergeObjects(o1[k],o2[k])
: (r = Object.assign({},o1,o2),o1[k]);
return r;
}, o1);
}
var objs = [{
fparams: {
keys : ['a', 'b'],
pairs: {
'p': 'qwert'
}
},
qparams: {
'x': 'xyz'
}
},
{
fparams: {
keys : ['c', 'd'],
pairs: {
'q': 'yuiop'
}
},
qparams: {
'z': 'zyx'
}
}],
result = objs.reduce(mergeObjects);
console.log(JSON.stringify(result,null,2));
答案 3 :(得分:0)
尝试此功能,我试图涵盖大多数情况,尽管它可能不如其他可用的库那么好
MAX
您可以按以下方式使用
var merge = function(obj1, obj2) {
for (var key in obj2) {
if (obj2.hasOwnProperty(key)) {
if (obj1[key] == null) {
obj1[key] = obj2[key];
} else if (obj1[key] instanceof Array) {
if (obj2[key] instanceof Array) {
for (var i =0; i < obj2[key].length; i++){
if (obj1[key].indexOf(obj2[key]) === -1) {
obj1[key].push(obj2[key][i]);
}
}
}
} else if (obj1[key] instanceof Object && obj2[key] instanceof Object && obj1[key].constructor == Object && obj2[key] == Object) {
merge(obj1[key], obj2[key]);
}
}
}
}