2016-08-09 49 views
0

ユーザーが作成したネストされたオブジェクトの配列があります。再帰的に配列がチェックされているかどうかをチェックして、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); 
    } 
} 

は、ネストされた配列の例です:

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

答えて

1

これは動作するはずです:

[ 
    {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" 
    ] 

はここで、オブジェクトの変換された配列の例です。再帰的なcheckProps関数の返されたobjは格納されていませんでした。

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);

+0

これは素晴らしいです!本当にありがとう! –

関連する問題