2016-08-28 3 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에 문제가 있어요 반복적으로 my_array_of_objects을 통해 루프가 트리 구조를 제거하고 각각 relationship_id과 parent_relationship_id 객체 줄 것이다 배열을 반환하기 위해 노력하고 있어요 나는 왜 그것을 볼 수없는 ... 나는 그것이 범위 문제라고 가정한다.

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에 닫는 ")"이 없어야하며 반복되어야합니다 (객체, 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 개의 질문을 대답으로 표시 할 수 있다면 Bergi는 먼저 대답했다. 대답 할 시간을 내 주셔서 다시 한번 감사 드리며, 많은 감사를드립니다. J – jon

+0

당신은 물론, 물론 아무 문제 없습니다. Bergi는 전문가입니다. :-) – trincot

관련 문제