2017-09-06 7 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に全く依存しませんが、その内部ループで呼び出されるべきではありませんが、の後にの後に呼び出されるべきではありません。

あなたはこの機能を使用することができます:

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

関連する問題