2017-09-06 1 views
-1

Benötigen Sie eine rekursive Funktion in Javascript/Jquery für unter JSON-Objekt.Rekursive Funktion In JavaScript für Array von Objekten mit unterschiedlichen Schlüsseln

Der Schlüssel "betroffen" ist der Blattknoten auf jeder Ebene.

Der Schlüssel "Kind" kann eine beliebige Anzahl von Ebenen haben, die Knoten in ihm "beeinflusst" haben können.

Ich möchte die Blattknoten ("impected") auf jeder Ebene mit dem untergeordneten ("Kind") Knoten auf derselben Ebene zusammenführen.

Es bedeutet Kindknoten auf jeder Ebene sollte Daten auch auf gleicher Ebene beeinflusst haben.

Eingang

{ 

    "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  
        }]  
    }]  
} 

Erwartete Ausgabe

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

Es ist OK, auch wenn wir "betroffen" Schlüssel aus dem Objekt nicht entfernen. Aber die Daten von "impacted" sollten mit "child" auf derselben Ebene zusammengeführt werden.

Ich habe versucht, mit folgenden function..but immer Duplikate auf jeder Ebene

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  
  } 

Vielen Dank im Voraus

+0

Könnten Sie jeder Codezeile setzen vier Räume vor und minify Ihre Beispieldaten? –

Antwort

0

Das Hauptproblem mit Ihrem Code ist, dass Sie die Funktion rekursiv innerhalb eines aufrufen Schleife auf k, während der rekursive Aufruf überhaupt nicht von k abhängt, so sollte es nicht in diesem inneren Loop aufgerufen werden, sondern nach es.

Sie könnten diese Funktion nutzen:

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

Verwandte Themen