2017-11-27 2 views
4

Vorschläge zum rekursiven Erstellen einer Gruppe verschachtelter Arrays/Objekte?Rekursives Erstellen eines verschachtelten Arrays

Ich lasse meine Benutzer mehrere Elemente mit einem schnellen Textarea hinzufügen. Sie werden Unterpositionen mit einem Sternchen anzeigen. Also habe ich einen String wie diesen, den ich in ein Array verwandeln möchte.

level 1.1 
level 1.2 
* level 1.2.1 
** level 1.2.1.1 
** level 1.2.1.2 
* level 1.2.2 

Dies ist das Ergebnis, das ich sehen möchte:

[ 
    { 
     name: "level 1.1" 
    }, 
    { 
     name: "level 1.2", 
     nodes: [ 
      { 
       name: "level 1.2.1", 
       nodes: [ 
        { 
         name: "level 1.2.1.1" 
        }, 
        { 
         name: "level 1.2.1.2" 
        } 
       ] 
      }, 
      { 
       name: "level 1.2.2" 
      } 
     ] 
    } 
] 

Die Herausforderung besteht darin, dass ich, dass die Knoten sinken wird nicht die Tiefe kennen.

Alle Vorschläge würden dankbar erhalten.

+4

... und was Sie versucht ist ??? –

+0

Hausaufgaben, ha! Bringt schreckliche Erinnerungen von vor langer Zeit zurück. Was passiert ist, dass ich Menschen die Möglichkeit gebe, mehrere Elemente gleichzeitig in einem Textbereich zu erstellen, wenn sie möchten, dass etwas ein verschachteltes Element ist, dann können sie die Sternchen hinzufügen. So sind die Eingabedaten wie angegeben. – Zagreus

+0

@Zagreus Klingt nach etwas, das viel Platz für Benutzerfehler lässt. Ich würde vorschlagen, Ihren Benutzern eine Schnittstelle zum Erstellen der verschachtelten Struktur zu geben. – JLRishe

Antwort

3

Dies ist ein linearer Ansatz ohne Rekursion.

Sie könnten die Sterne zählen und diese Information für die gewünschte Ebene des gegebenen Knotens nehmen.

Dieser Vorschlag verwendet ein Array als Verweis auf die zuletzt eingefügte Ebene und verwaltet die gewünschte Objektstruktur.

Diese Lösung bietet keine Plausibilitätsprüfungen, wenn eine Ebene fehlt.

var data = ['level 1.1', 'level 1.2', '* level 1.2.1', '** level 1.2.1.1', '** level 1.2.1.2', '* level 1.2.2'], 
 
    result = [], 
 
    levels = [{ nodes: result }]; 
 

 
data.forEach(function (s) { 
 
    var level = (s.match(/^\*+(?=\slevel)/) || [''])[0].length, 
 
     name = s.match(/[^*]+$/)[0].trim(); 
 

 
    levels[level].nodes = levels[level].nodes || []; 
 
    levels[level].nodes.push(levels[level + 1] = { name: name }); 
 
}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Das ist großartig, danke. Wenn ich es verstehe, verwenden Sie Regex, um herauszufinden, wie viele * s es gibt. Ich werde eine schnelle Validierung einwerfen, um sicherzustellen, dass es keine verpassten Ebenen gibt und ich sollte gut gehen. – Zagreus

Verwandte Themen