如何从此对象中消除数组?

时间:2014-05-29 09:38:38

标签: javascript arrays object

我将两个对象(obj1obj2)与一个简单的函数组合在一起:

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

2 个答案:

答案 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;
};

工作演示:http://jsfiddle.net/jfriend00/95s36/