仅使用嵌套对象文字填充数组

时间:2015-02-03 18:25:21

标签: javascript arrays object-literal

在这段代码中,我打算在父对象中找到所有嵌套对象文字。我的嵌套对象之一有一个名为places的数组作为它自己的属性。我有一个名为getObjNum的递归函数,它遍历每一个property并在父对象中找到嵌套的对象文字。

在我的Parent对象中有三个嵌套的对象文字。其中一个有一个数组作为property.So container数组,它应该存储所有找到的嵌套对象文字,必须有3个索引。但是数组的位置也是包含为容器数组的第四个索引。我找到了

typeof(array)=='object' returns true;
arr instanceof Object also returns true;

如何防止将place数组与其他对象文字一起插入容器数组?

enter image description here

var getValue;
  var parentObj = {
     parentProp: 10,
       childObj: {
           childProp: 20,
                    grandChildObj: {
                       y: {
                          z:'lol',
                          places:['newyork','canada','dhaka']
                       }
                    }
                }
      }


var arr=[];
var container=[];
var count=0;

function getObjNum(obj){

      var prop=Object.getOwnPropertyNames(obj);
      for(i=0;i<prop.length;i++){
          if(typeof(obj[prop[i]])=='object'){
            container.push(obj[prop[i]]);
            count++;
            getObjNum(obj[prop[i]]);
          }

      }
}
getObjNum(parentObj);

console.log(container);

1 个答案:

答案 0 :(得分:0)

正如评论中所指出的,您可以使用instanceof Array来检查对象是否是数组,如下所示:

function getChildObjects(obj, returnArr) {
    return Object.keys(obj).reduce(function (arr, key) {
        var prop = obj[key];
        if (typeof prop === 'object' && !(prop instanceof Array)) {
            arr.push(prop);
            arr = getChildObjects(prop, arr);
        }
        return arr; 
    }, returnArr || []);
}

var parentObj = {
    parentProp: 10,
    childObj: {
        childProp: 20,
        grandChildObj: {
            y: {
                z:'lol',
                places:['newyork','canada','dhaka']
            }
        }
    }
};

var childs = getChildObjects(parentObj);

console.log(childs, childs.length);