2016-08-26 1 views
5

hat ich einen Anwendungsfall, in dem es eine JSON-Antwort von Back-End in Form kommt wie folgt:alle Arrays entfernen, die Leistung == 0

[ 
    { 
    "name": "cab", 
    "child": [ 
     { 
     "name": "def", 
     "child": [ 
      { 
      "name": "ghi", 
      "power": "0.00", 
      "isParent": false 
      } 
     ], 
     "power": "1.23", 
     "isParent": true 
     } 
    ], 
    "power": "1.1", 
    "isParent": true 
    }, 
    { 
    "name": "hhi", 
    "child": [ 
     { 
     "name": "hhi2", 
     "child": [ 
      { 
      "name": "hhi3", 
      "power": "0.00", 
      "isParent": false 
      } 
     ], 
     "power": "1.23", 
     "isParent": true 
     } 
    ], 
    "power": "1.1", 
    "isParent": true 
    } 
] 

Ich brauche alle Objekte zu entfernen, die Macht hat == 0 Es ist einfach, Filter für die einfache Sammlung von Arrays zu verwenden, aber es kann Fälle geben, in denen die Anzahl der untergeordneten Elemente darin enthalten sein kann.

Vielen Dank im Voraus!

+1

Sie wissen, was Rekursion ist? –

+2

Zu deinem Zweck soll die Zeichenkette '" 0.00 "' gleich '0' sein? Wenn ein übergeordnetes Element die Potenz 0 hat, aber seine untergeordneten Elemente nicht über die Leistung 0 verfügen, sollte das übergeordnete Element (und damit alle untergeordneten Elemente) entfernt werden? – nnnnnn

+0

@nnnnnn, 0.00 ist eine Zeichenfolge und Macht == 0.00 sollte der Scheck sein. –

Antwort

5

iterieren einfach über die Arrays mit einer rekursiven Funktion:

var json = ["JSON_HERE"]; 
function deleteIterator(json) { 
    if(json.power == "0.00") { 
    return null; 
    } else if(json.child) { 
    json.child = deleteIterator(json.child); 
    } 
    return json; 
} 
for(var i = 0; i < json.length; i++) { 
    json[i] = deleteIterator(json[i]); 
} 

Was das bedeutet ist:

  1. Iterate über die JSON Kinder.
  2. Überprüfen Sie, ob die Stromversorgung "0.00" ist.
    • Wenn ja, entfernen Sie es (Return null)
  3. Überprüfen Sie, ob es Kinder
    • hat Ist dies der Fall, dann iterieren es (gehen Sie zu Schritt 2)
  4. Geben Sie das JSON-Element zurück.
+1

Das wird es tun :) –

+0

[Verwenden Sie nicht 'für ... in', um über ein Array zu iterieren] (http://StackOverflow.com/q/500504/5743988), und stellen Sie sicher um 'i' zu deklarieren, damit Sie kein globales erstellen. – 4castle

+0

Gotcha @ 4castle –

2

Wiederholen Sie das Objekt rekursiv, suchen Sie jedes Mal nach einem Kind und filtern Sie nach Leistung === 0 oder was auch immer Ihre Anforderungen sind.

Wenn Sie nicht wissen, wie Rekursion zu verwenden, here is a tutorial, um loszulegen. Ich hoffe wirklich, dass jemand nicht hinter mir her kommt und dir die genaue Lösung für dein Problem gibt, denn das solltest du selbst lösen können, wenn du weißt, wie man Rekursion einsetzt. Sie könnten auch Schleifen verwenden, aber .. Rekursion ist am besten.

Edit: Dieses Problem wurde gelöst before, in einem anderen Geschmack, aber alle gleich. Wenn Sie feststellen, dass Ihre Implementierung mit Fehlern behaftet ist, die Sie nicht herausfinden können, zögern Sie nicht, mich in einer neuen Frage zu erwähnen, und ich werde mein Bestes versuchen, Ihnen zu helfen.

+3

Ja, es ist ein Antworten. Die Person möchte wissen, wie es geht. Ich habe ihm gezeigt, wie. Ich bin nicht verpflichtet, ihm genauen Code zu geben, und ich denke, es ist eine schlechte Idee, dies zu tun. Wir sollten SO-Nutzer nicht dazu ermutigen, diese Website als "Fragen und Empfangen von Code, den Sie kopieren und nie verstehen können" zu sehen. Geben Sie den Menschen stattdessen die Mittel, das Problem selbst zu lösen. –

+0

@patrik: Verstanden, was du meintest. Nochmals vielen Dank :) –

1

Sie rekursiv Array#filter mit einer benannten Funktion Ausdruck mit laufen kann:

var objArray = [{"name":"cab","child":[{"name":"def","child":[{"name":"ghi","power":"0.00","isParent":false}],"power":"1.23","isParent":true}],"power":"1.1","isParent":true},{"name":"hhi","child":[{"name":"hhi2","child":[{"name":"hhi3","power":"0.00","isParent":false}],"power":"1.23","isParent":true}],"power":"1.1","isParent":true}]; 
 

 
objArray = _.filter(objArray, function powerFilter(o) { 
 
    if (o.power == 0) return false; 
 
    if (o.isParent && o.child) { 
 
    o.child = _.filter(o.child, powerFilter); // recursive call 
 
    o.isParent = o.child.length > 0; 
 
    if (!o.isParent) delete o.child; 
 
    } 
 
    return true; 
 
}); 
 

 
console.log(objArray);
<script src="https://cdn.jsdelivr.net/underscorejs/1.8.3/underscore-min.js"></script>

+0

Tippfehler mit dieser zusätzlichen 'return' Anweisung? Auch, muss diese Callback-Funktion in der 'filter()' -Funktion benannt werden (Konvention ist anonyme Funktion, richtig?) –

+0

@LambdaNinja Es muss benannt werden, um es rekursiv zu referenzieren. Siehe [diese Antwort] (http://stackoverflow.com/a/38132582/5743988) als Referenz. Was ist der Tippfehler? – 4castle

+0

Sie haben den Tippfehler in Ihrer Bearbeitung korrigiert und ich habe den Zweck des Namens nicht früher erkannt. Nette Lösung. +1. –

Verwandte Themen