以递归方式重新创建嵌套对象数组

时间:2016-08-09 17:15:21

标签: javascript angularjs recursion

我有一个由用户创建的嵌套对象数组。我需要以递归方式检查数组是否将checked设置为true并重新创建嵌套的对象数组,如下所示。

通过我最初的尝试,我能够以递归方式通过嵌套数组。但是,每次递归时,我都会覆盖以前的信息。

$scope.newPropertyTemplate = [];

function checkProps (item, props){
    debugger
    var obj = {};
    var arr = [];

    for(var i in props){

        if(props[i].checked === true){
            obj.property = item;
            arr.push(props[i].name);
            obj.subProperties = arr;
        }

        if(props[i].properties){
            checkProps(props[i].name, props[i].properties);
        }
    }

    return obj;
}

for(var i = 0; i < $scope.propertyTemplate.length; i++){

    if($scope.propertyTemplate[i].properties !== null){

        $scope.newPropertyTemplate.push(checkProps($scope.propertyTemplate[i].name, $scope.propertyTemplate[i].properties));
        // $scope.newPropertyTemplate.push( newItem.property = $scope.propertyTemplate[i].name );
    }
    else {
        $scope.newPropertyTemplate.push($scope.propertyTemplate[i].name);
    }
}

以下是嵌套数组的示例:

    [
     {name: "allocation",
      properties:[
      {    
          name: "oid", 
          checked: true, 
          properties: null, 
          type: "integer"
      },
      {
          name: "person", 
          checked: false, 
          properties: [
              {
                  name: "Expires",
                  checked: true,
                  properties: null,
                  type: "timestamp"
              },
              {
                  name: "State/Province",
                  checked: true,
                  properties: null,
                  type: "string"
              }
          ]
      ],
      type: "allocation"
    ]

以下是转换后的对象数组的示例:

[
 {property: "allocation",
  subProperties: [
      "oid",
      {property: "person",
       subProperties: [
           "Expires",
           "State/Province"
       ]
      }
  ]
 }
]

1 个答案:

答案 0 :(得分:1)

这应该有效。 obj函数的返回checkProps

var data = [{
  name: "allocation",
  properties: [{
      name: "oid",
      checked: true,
      properties: null,
      type: "integer"
    }, {
      name: "person",
      checked: false,
      properties: [{
        name: "Expires",
        checked: true,
        properties: null,
        type: "timestamp"
      }, {
        name: "State/Province",
        checked: true,
        properties: null,
        type: "string"
      }]
    },

  ],
  type: "allocation"
}];

function process(paths) {
  var arr = [];
  data.forEach(function(template) {
    var resultObj = {};
    recurse(template, resultObj);
    arr.push(resultObj);
  });
  console.log(arr);
}

function recurse(template, obj) {
  obj.property = template.name;
  if (template.properties == null)
    return;
  obj.subProperties = [];
  template.properties.forEach(function(prop) {
    var res = {};
    if (prop.properties != null)
      recurse(prop, res);
    else if (prop.checked)
      res = prop.name;
    if (res)
      obj.subProperties.push(res);
  });;
}

process(data);