我将两个对象(obj1
和obj2
)与一个简单的函数组合在一起:
OBJ1:
{ obj1-1: 'value',
obj1-2: { obj1-2-1: 'value', obj1-2-2: 'value' } }
Obj2:
{ childs:
[ { obj2-1: 'value',
obj2-2: 'value',
obj2-3: 'value',
obj2-4: 'value',
obj2-5: 'value' } ] }
合并功能:
// Merge objects
var merge = function(obj1,obj2) {
var combined = {};
for (var attrname in obj1) { combined[attrname] = obj1[attrname]; };
for (var attrname in obj2) { combined[attrname] = obj2[attrname]; };
return combined;
};
这会产生以下对象obj3
,其中包含嵌套数组:
{ obj1-1: 'value',
obj1-2: { obj1-2-1: 'value', obj1-2-2: 'value' } }
{ childs: // this is obj2
[ { obj2-1: 'value',
obj2-2: 'value',
obj2-3: 'value',
obj2-4: 'value',
obj2-5: 'value' } ] }
但是,我想从对象中删除嵌套数组,并希望它看起来像这样:
{ obj1-1: 'value',
obj1-2: { obj1-2-1: 'value', obj1-2-2: 'value' } }
{ obj2-1: 'value', // this is obj2
obj2-2: 'value',
obj2-3: 'value',
obj2-4: 'value',
obj2-5: 'value' }
我可以在合并功能中执行此操作吗?对象的结构总是相同的,因此它可能是一个肮脏的解决方案。
P.s。:我已尝试将合并功能中obj2
的行更改为:
for (var attrname in obj2.childs) { combined[attrname] = obj2.childs[attrname]; };
但是回归:
{ obj1-1: 'value',
obj1-2: { obj1-2-1: 'value', obj1-2-2: 'value' } }
{ "0": // this is obj2
{ obj2-1: 'value',
obj2-2: 'value',
obj2-3: 'value',
obj2-4: 'value',
obj2-5: 'value' } }
所以我仍然无法消除"0"
父母。当我尝试这个时:
for (var attrname in obj2.childs[0]) { combined[attrname] = obj2.childs[0][attrname];};
它返回错误:Cannot read property '0' of undefined
答案 0 :(得分:0)
有助于了解最初的 obj 和 obj2 。 (已完成)
这两个库函数可能对类似的操作有用:
超快速&脏解决方案,假设数组只有一个对象: http://plnkr.co/edit/JN7Ptwk5VTo2IGYF7xvc?p=previewv(打开控制台查看结果)
var merge = function(obj1,obj2) {
var combined = {};
for (var attrname in obj1) {
combined[attrname] = obj1[attrname];
};
// Does the array contain more objects?
for (var attrname in obj2.childs[0]) {
combined[attrname] = obj2.childs[0][attrname];
};
return combined;
}
(它非常快速和肮脏,不是真的推荐但是为指定的输入做了工作)
(更通用的是迭代所有索引,而不仅仅是第一个 - [0] - 一个)
答案 1 :(得分:0)
假设您可以展平在对象顶层找到的所有数组,您可以这样做:
// Merge objects
var merge = function(obj1,obj2) {
function copy(src, dest) {
for (var prop in src) {
var item = src[prop];
if (item instanceof Array) {
for (var i = 0; i < item.length; i++) {
copy(item[i], dest);
}
} else {
dest[prop] = item;
}
}
}
var combined = {};
copy(obj1, combined);
copy(obj2, combined);
return combined;
};