2017-09-06 8 views
-1

아래 json 객체에 대한 javascript/jquery에서 재귀 함수가 필요합니다.재귀 함수 다른 키가있는 객체 배열을위한 JavaScript에서

"영향을받는"키는 각 레벨의 리프 노드입니다.

키 "자식"에는 노드에 "영향을 미친"레벨이있을 수 있습니다.

모든 레벨에서 리프 노드 ("영향")를 동일한 레벨의 하위 ("하위") 노드에 병합하려고합니다.

모든 레벨의 하위 노드가 같은 수준의 데이터에도 영향을 미쳤 음을 의미합니다.

입력

{ 

    "Data": [{ 
        "id": 1745, 
        "name": "Top Parent", 
        "parentId": null, 
        "child": [{ 
            "id": 1746, 
            "name": "Sub Parent- child to Top Parent", 
            "parentId": 1745, 
            "child": [{ 
                    "id": 1747, 
                    "name": "child to Sub Parent--One ", 
                    "parentId": 1746 
                }, 
                { 
                    "id": 1748, 
                    "name": "child to Sub Parent--two", 
                    "parentId": 1746, 
                    "child": [{ 
                        "id": 1749, 
                        "name": "Child to two",  
                        "parentId": 1748 
                    }], 
                    "impacted": [{ 
                        "id": 2471, 
                        "name": "Leaf of two ", 
                        "network": true 
                    }] 
                } 
            ], 
            "impacted": [{ 
                    "id": 2470, 
                    "name": "Leaf of Sub Parent-1 ", 
                    "network": true 
                }, 
                { 
                    "id": 2469, 
                    "name": "Leaf of Sub Parent-1", 
                    "network": true 
                }  
            ]  
        }],  
        "impacted": [{  
            "id": 2468,  
            "name": "Leaf Of Top Parent",  
            "network": true  
        }]  
    }]  
} 

예상 출력

{  
    "Data": [{  
        "id": 1745,  
        "name": "Top Parent",  
        "parentId": null,  
        "child": [{  
                "id": 1746,  
                "name": "Sub Parent- child to Top Parent",  
                "parentId": 1745,  
                "child": [{  
                        "id": 1747,  
                        "name": "child to Sub Parent--One ",  
                        "parentId": 1746  
                    },  
                    {  
                        "id": 1748,  
                        "name": "child to Sub Parent--two",  
                        "parentId": 1746, 
                        "child": [{  
                                "id": 1749,  
                                "name": "Child to two",  
                                "parentId": 1748  
                            },  
                            {  
                                "id": 2471,  
                                "name": "Leaf of two ",  
                                "network": true  
                            }  
                        ]  
                    },  
                    {  
                        "id": 2470,  
                        "name": "Leaf of Sub Parent-1 ",  
                        "network": true  
                    },  
                    {  
                        "id": 2469,  
                        "name": "Leaf of Sub Parent-1",  
                        "network": true  
                    }  
                ]  
            },  
            {   
                "id": 2468,  
                "name": "Leaf Of Top Parent",  
                "network": true  
            }  
        ]  
    }]  
} 

우리는 개체에서 "영향"키를 제거하지 않는 경우에도 그것은 OK입니다. 그러나 "영향을받은"데이터는 같은 수준의 "자식"과 병합되어야합니다.

나는 코드의 주된 문제는 당신이 내부에 재귀 적으로 함수를 호출한다는 것입니다

+0

는 각 코드 라인의 앞에 4 개의 공백을 넣어 귀하의 예제 데이터를 축소하세요 수 :

이 기능을 사용할 수 있을까? –

답변

0

각 레벨에서 점점 중복 function..but 사전에

repeatLoop(data){  
    if(data && data.length){  
        for(var i=0;i<data.length;i++){  
       if(data[i].child && data[i].child.length && data[i].impacted && data[i].impacted.length){  
                for(var k=0; k<data[i].impacted.length;k++){  
                     data[i].child.push(data[i].impacted[k])  
                     this.repeatLoop(data[i].child)  
                }  
         }  
       }  
     }  
       return data  
  } 

감사를 다음과 같이 시도 루프는 k에 있고 재귀 호출은 k에 전혀 의존하지 않으므로 내부 루프에서는 호출하면 안되며 이후에 후에 호출해야합니다.

class X { 
 
    repeatLoop(data) { 
 
     if (!Array.isArray(data)) return; 
 
     for (var item of data) { 
 
      this.repeatLoop(item.child); 
 
      if (item.impacted) { 
 
       item.child = (item.child || []).concat(item.impacted); 
 
       delete item.impacted; 
 
      } 
 
     } 
 
    } 
 
} 
 

 
// Sample input 
 
var data = { 
 
    "Data": [{ 
 
     "id": 1745, 
 
     "name": "Top Parent", 
 
     "parentId": null, 
 
     "child": [{ 
 
      "id": 1746, 
 
      "name": "Sub Parent- child to Top Parent", 
 
      "parentId": 1745, 
 
      "child": [{ 
 
        "id": 1747, 
 
        "name": "child to Sub Parent--One ", 
 
        "parentId": 1746 
 
       }, 
 
       { 
 
        "id": 1748, 
 
        "name": "child to Sub Parent--two", 
 
        "parentId": 1746, 
 
        "child": [{ 
 
         "id": 1749, 
 
         "name": "Child to two",  
 
         "parentId": 1748 
 
        }], 
 
        "impacted": [{ 
 
         "id": 2471, 
 
         "name": "Leaf of two ", 
 
         "network": true 
 
        }] 
 
       } 
 
      ], 
 
      "impacted": [{ 
 
        "id": 2470, 
 
        "name": "Leaf of Sub Parent-1 ", 
 
        "network": true 
 
       }, 
 
       { 
 
        "id": 2469, 
 
        "name": "Leaf of Sub Parent-1", 
 
        "network": true 
 
       }  
 
      ]  
 
     }],  
 
     "impacted": [{  
 
      "id": 2468,  
 
      "name": "Leaf Of Top Parent",  
 
      "network": true  
 
     }]  
 
    }]  
 
}; 
 
// Call function 
 
new X().repeatLoop(data.Data); 
 
// Display mutated data: 
 
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }