2016-06-15 12 views
0

zurückgeben Ich konnte nicht auf StackoverlFlow eine Lösung dafür finden, und ich habe an diesem Problem seit einiger Zeit gearbeitet. Es ist ein bisschen schwierig, also lass es mich wissen, wenn ich mehr Informationen geben sollte.Versuchen, ein tief verschachteltes Objekt mit Lodash

Mein Problem: Ich habe ein JSON-Objekt von Lands, jedes Land hat eine ID und ein Blocks-Array zugeordnet und das Blöcke Array hat Block mit IDs auch.

Vorschau:

var Lands = [{ 
       'LandId':'123', 
       'something1':'qwerty', 
       'something2':'qwerty', 
       'Blocks': [ 
        { 
         'id':'456', 
         'LandId':'123' 
        }, 
        { 
         'BlockId':'789', 
         'LandId':'123' 
        } 
       ] 
      }, 
      ...More Land Objects]; 

Hinweis: Die Daten sind nicht Setup die Art, wie ich es getan hätte, aber das war vor langer Zeit getan, und ich habe mit dem arbeiten, was ich habe jetzt für.

Ich versuche, eine lodash-Funktion zu schreiben, die die BlockId, die ich habe, zu nehmen und sie übereinstimmen und die LandId aus den Blöcken zurückgeben wird.

so das Endergebnis wäre eine Liste von LandId, die von den Blöcken zurückgegeben wurden.

Ich war so etwas wie diese verwenden und es zurückkehrte keine Ergebnisse:

selectedLand = function(Lands, landIDs){ 
       return _.filter(Lands, function(land){ 
        return land === landIDs[index]; 
       }); 
      }; 

Ich weiß, dass ich über das der falsche Weg werde und möchte die geeignete Art und Weise wissen, dass dies zu nähern und es zu lösen. jede Hilfe wird sehr geschätzt.

Antwort

2
selectedLand = function(Lands, landIDs){ 
       return _.filter(Lands, function(land){ 
        return land === landIDs[index]; 
       }); 
      }; 

Beachten Sie, dass index jede Definition in diesem Bereich fehlt, so wird diese Funktion im Wesentlichen nie true zurück, abgesehen von einem glücklichen (?) Unfall mit einer extern index definiert. Und immer wenn Sie _.filter(someArr,function(){return false;}) anrufen, erhalten Sie []. Undefined index beiseite, dies tut strengen Vergleich eines Landobjekts gegen (vielleicht) eine Zeichenfolge in LandIDs

Ich bin ein wenig unklar über die genauen Anforderungen Ihrer Auswahl, so dass Sie diesen Filter auf Ihre Bedürfnisse anpassen können. Die Funktion Filter der lands Array durch Prüfen, ob die .blocks Array-Eigenschaft einige Werte hat, wo die .landID Eigenschaft ist enthalten im landsID Array.

Zum Schluss, wenn Sie das Beste aus lodash (oder meinem Lieblings, ramda.js) machen wollen, schlage ich vor, Sie setzen sich und lesen Sie die docs. Klingt tödlich langweilig, aber 75% des Kampfes mit Datentransformationen wissen, was in Ihrer Toolbox ist. Beachten Sie, dass die englische Beschreibung des Prozesses fast genau mit dem Beispielcode übereinstimmt (Filter, einige, includes).

var Lands = [{ 
 
    'LandId': '123', 
 
    'something1': 'qwerty', 
 
    'something2': 'qwerty', 
 
    'Blocks': [{ 
 
     'id': '456', 
 
     'LandId': '123' 
 
    }, { 
 
     'BlockId': '789', 
 
     'LandId': '123' 
 
    }] 
 
    } 
 
]; 
 

 
// assuming lands is like the above example 
 
// and landIDs is an array of strings 
 
var selectLandsWithBlocks = function(lands, landIDs) { 
 
    return _.filter(lands, function(land) {  
 
    var blocks = land.Blocks; 
 
    var blockHasALandId = function(block) { 
 
     return _.includes(landIDs,block.LandId); 
 
    }; 
 
    return _.some(blocks, blockHasALandId); 
 
    }); 
 
}; 
 

 
console.log(selectLandsWithBlocks(Lands,[])); 
 
console.log(selectLandsWithBlocks(Lands,['mittens'])); 
 
console.log(selectLandsWithBlocks(Lands,['123']));
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.min.js"></script>

+0

Das war ein großartiges Beispiel, und ich arbeite mich jetzt die Unterlagen durch, was der wirkliche Unterschied zwischen lodash und ramda.js sein würde? – Keeano

+1

@Keeano Sie können auf ähnliche Weise verwendet werden. Lodash ist beliebter und hat mehr Hilfsfunktionen (wie _.camelCase) und kann nicht alles curry (es kann etwas. Aber nicht alles). Ramda ist eine praktische Funktionsbibliothek, mit der Sie Funktionen ganz einfach curren und leiten können. [Hier ist die gleiche Lösung mit ramda.] (Https://jsbin.com/wopibiwidi/edit?js,console). Es gibt einige Beispiele, aber es läuft auf die Liste '|> R hinaus.Filter |> R.any |> R.enthält '. Sehr ähnlich zu lodash (da es dieselbe Logik ist), aber Ramda wird einfacher, da Sie mit komplexeren Transformationen erweitern müssen. – user01

+0

Ich bin auf ein Problem fest und habe keine Arbeit gefunden ... würden Sie mir helfen, wenn ich Ihnen meine E-Mail zur Verfügung stellen kann? ich habe die docs durchgelesen, wie sie es beschrieben haben, und ich bekomme immer noch eine komische rückkehr ... ich benutze deinen filter und verbessere ihn etwas, um etwas anderes zu bekommen. – Keeano

Verwandte Themen