2016-05-12 5 views
0

Ich muss eine JavaScript-Funktion erstellen, um eine rekursive Suche nach einem Objekt durchzuführen und den Labelnamen für die angegebene ID zu erhalten.Rekursive Suchfunktion für Javascript Objekt mit Arrays verschachtelter Objekte

Ich versuchte mit dem folgenden Code, aber es gibt undefined für jede ID zurück. Bitte helfen Sie mir, dieses Problem zu beheben.

function GetLabel(data, Id) { 
    var i, 
    currentChild, 
    result; 

    if (Id == data.Id) { 
    return data['Label']; 
    } else { 
    for (field in data) { 
     if (typeof(data[field]) == "object") { 
     result = GetLabel(data[field], Id); 
     if (result != "") return result; 
     } 

     if (data[field] == Id) { 
     result = data['Label']; 
     return result; 
     } 
    } 
    } 
} 
+0

Zeigen Sie uns Ihre json zu –

+0

Ihre IDs sind einzigartig Unter der Annahme, gibt es zwei Ansätze. Wenn Sie diese Suche mehrmals durchführen, ist es am besten, Ihre verschachtelte Struktur in eine Hash-Tabelle wie ein großes Objekt mit Eigenschaften von "id" zu glätten und Sie suchen jedes Mal nach Tabelle [id], wenn Sie eine Suche durchführen müssen. Oder wenn Sie nicht viele Suchen durchführen, kann für diesen Job auch eine rekursive Methode implementiert werden, die bei jeder Suche nach einem verrückten Hund durch den ganzen Baum läuft. – Redu

Antwort

0

Diese Antwort wird auf der Datenstruktur dieser Frage zugrunde: JSON Schema for tree structure

Dieser Vorschlag verwendet eine eine Funktion zum rekursiven Aufruf und einige Änderungen, im Grunde für die Iteration von child, die stattdessen ein Array ist ein Objekt, das sein könnte.

Nach einer Überprüfung, ob child ein Array ist, hilft Array#some Iteration und stoppt, wenn die gewünschte id gefunden wird.

Ich empfehle, eine gemeinsame Styleguide für die Benennung von Konvention und schreiben Sie alle Eigenschaften in kleinen Buchstaben, sowie Funktionen, die nicht als Konstruktor verwendet werden können.

function getLabel(data, id) { 
 
    var result; 
 
    if (id === data.id) { 
 
     return data.label; 
 
    } 
 
    Array.isArray(data.child) && data.child.some(function (a) { 
 
     result = getLabel(a, id); 
 
     if (result) { 
 
      return true; 
 
     } 
 
    }); 
 
    return result; 
 
} 
 

 
var tree = { id: 1, label: "A", child: [{ id: 2, label: "B", child: [{ id: 5, label: "E" }, { id: 6, label: "F" }, { id: 7, label: "G" }] }, { id: 3, label: "C" }, { id: 4, label: "D", child: [{ id: 8, label: "H" }, { id: 9, label: "I" }] }] }, 
 
    i; 
 

 
for (i = 1; i < 10; i++) { 
 
    document.write(getLabel(tree, i) + '<br>'); 
 
}

Verwandte Themen