2016-08-28 9 views
0

私はオブジェクトの配列を持っています。オブジェクトにはchildrenというプロパティがあり、inturnにはオブジェクトの配列が含まれます。 事実上、オブジェクトのツリーです。配列を返す再帰的なjavascript関数

var my_array_of_objects=[ 
    { 
    "object_info": "blah blah", 
    "children": [ 
     { 
     "object_info": "blah blah", 
     "children": [ 
      { 
      "object_info": "blah blah" 
      } 
     ] 
     } 
    ] 
    }, 
    { 
    "object_info": "blah blah" 
    }, 
    { 
    "object_info": "blah blah" 
    } 
] 

私はしかし、私は再帰前に設定取得relationship_idに問題が生じています、ツリー構造を削除し、それぞれがrelationship_idとparent_relationship_idオブジェクト与える配列を返すmy_array_of_objectsを再帰的にループしようとしていますなぜ起こるのかわかりません...私はそれがスコープ上の問題だと思いますか?

function sort_relationships(objects, return_objects, parent_relationship_id, relationship_id){ 
     $.each(objects, function(field_key, object){ 
     relationship_id++; 
     var new_object={}; 
     new_object.relationship_id=relationship_id; 
     new_object.parent_relationship_id=parent_relationship_id; 
     new_object.object_info=object.object_info; 
     // PUSH OBJECT TO THE ARRAY TO BE RETURNED 
     return_objects.push(new_object); 
     // IF THE OBJECT HAS CHILDREN THEN RUN THE FUNCTION AGAIN WITH IT'S OBJECTS 
     if(object.children instanceof Array){ 
      sort_relationships(object.children,return_objects,new_object.relationship_id,relationship_id); 
     } 
     }); 
     return return_objects; 
    } 

するvar my_new_array = sort_relationships(my_array_of_objects、[]、0,0)。

上記のコードに基づいて、新しいオブジェクトごとに固有のrelationship_idがあることが予想されますが、次のコードが返されます。

[ 
    { 
    "relationship_id": 1, 
    "parent_relationship_id": 0, 
    "object_info": "blah blah" 
    }, 
    { 
    "relationship_id": 2, 
    "parent_relationship_id": 1, 
    "object_info": "blah blah" 
    }, 
    { 
    "relationship_id": 3, 
    "parent_relationship_id": 2, 
    "object_info": "blah blah" 
    }, 
    { 
    "relationship_id": 2, 
    "parent_relationship_id": 0, 
    "object_info": "blah blah" 
    }, 
    { 
    "relationship_id": 3, 
    "parent_relationship_id": 0, 
    "object_info": "blah blah" 
    } 
] 

私は以下の持っていることを期待する:あなたは、各再帰呼び出しに対してローカルで、呼び出し元に反映されていない変数にrelationship_id++をやっている

[ 
    { 
    "relationship_id": 1, 
    "parent_relationship_id": 0, 
    "object_info": "blah blah" 
    }, 
    { 
    "relationship_id": 2, 
    "parent_relationship_id": 1, 
    "object_info": "blah blah" 
    }, 
    { 
    "relationship_id": 3, 
    "parent_relationship_id": 2, 
    "object_info": "blah blah" 
    }, 
    { 
    "relationship_id": 4, 
    "parent_relationship_id": 0, 
    "object_info": "blah blah" 
    }, 
    { 
    "relationship_id": 5, 
    "parent_relationship_id": 0, 
    "object_info": "blah blah" 
    } 
] 
+0

は、あなたの質問にご期待出力を含めることができます。 –

+0

@Rafi Ud Daula Refat .. Thnaks、私は予想される結果を追加しました。 – jon

+1

@Rafi Ud Daula Refat ..編集をしてくれてありがとう:) – jon

答えて

1

。あなたのいずれかが更新された値をreturn、または単に自由変数を使用する必要があります。

function sort_relationships(objects) { 
    var return_objects = []; 
    var relationship_id = 0; 
    function recurse(objects, parent_relationship_id) { 
     $.each(objects, function(field_key, object) { 
      relationship_id++; 
      var new_object = { 
       relationship_id: relationship_id, 
       parent_relationship_id: parent_relationship_id, 
       object_info: object.object_info 
      }; 
      // PUSH OBJECT TO THE ARRAY TO BE RETURNED 
      return_objects.push(new_object); 
      // IF THE OBJECT HAS CHILDREN THEN RUN THE FUNCTION AGAIN WITH IT'S OBJECTS 
      if (Array.isArray(object.children)) { 
       recurse(object.children, new_object.relationship_id); 
      } 
     }); 
    } 
    recurse(objects, 0); 
    return return_objects; 
} 

var my_new_array=sort_relationships(my_array_of_objects); 
+0

それは完璧です、そして、私が完全に理解しているかどうかはわかりませんが、あなたの説明に感謝します。あなたのコードにいくつかのタイプミスがあり、new_objectは閉じていてはいけません ")"、それはrecurse(objects、0)でなければなりません。私はできるだけ早く正しい答えとしてマークします:))...もう一度感謝します。 – jon

1

あなたはこのためreduceを使用することができ、及び(物事がうまくいかない)idには、親IDに数を追加することができます既に累積オブジェクト:

function flatten(arr, parentId = 0) { 
 
    if (!arr) return []; 
 
    return arr.reduce (function (acc, obj) { 
 
     var rel = { 
 
      object_info: obj.object_info, 
 
      relationship_id: parentId + acc.length + 1, 
 
      parent_relationship_id: parentId 
 
     }; 
 
     return acc.concat([rel], flatten(obj.children, rel.relationship_id)); 
 
    }, []); 
 
} 
 

 
// sample data 
 
var my_array_of_objects=[{ 
 
    "object_info": "blah blah", 
 
    "children": [{ 
 
     "object_info": "blah blah", 
 
     "children": [{ 
 
      "object_info": "blah blah" 
 
      } 
 
     ] 
 
     } 
 
    ] 
 
    }, { 
 
    "object_info": "blah blah" 
 
    }, { 
 
    "object_info": "blah blah" 
 
    } 
 
]; 
 

 
// convert 
 
var result = flatten(my_array_of_objects); 
 
// output 
 
console.log(result);

+0

あなたの答えをありがとう、それも完璧に動作します。私が答えとして2つの質問を記入することができれば、ベルギーは最初に答えました...答えに時間をとってくれてありがとう、大変感謝しています。 J – jon

+0

あなたは大歓迎ですが、もちろん問題ありません。 Bergiは専門家です:-) – trincot