2017-06-21 2 views
1

Ich habe eine ganze Weile versucht, dies herauszufinden. Immer noch relativ neu in _Underscore JS und ich versuche, ein Array von eindeutigen Werten aus einem Array verschachtelter Objekte zu erstellen. Beispieldaten unten:Erstellen Sie ein Array von Werten aus einem verschachtelten Objekt mit _Underscore

[ 
    { 
     "property":"prop1", 
     "list":[ 
     { 
      "description":"description blah", 
      "type":"F", 
      "values":{ 
       "value1":30.0, 
       "value2":0.0 
      } 
     }, 
     { 
      "description":"description blah", 
      "type":"F", 
      "values":{ 
       "value1":30.0, 
       "value2":0.0 
      } 
     } 
     ] 
    }, 
    { 
     "property":"prop2", 
     "list":[ 
     { 
      "description":"description blah", 
      "type":"Q", 
      "values":{ 
       "value1":30.0, 
       "value2":0.0 
      } 
     } 
     ] 
    } 
] 

Was ich versuche, zurück zu bekommen, ist ein Array von ALLEN EINZIGARTIG verschachtelten "Typ" -Werten. Beispiel für Daten wieder unter:

["F","Q"] 

I _.pluck und _.map mit wenig Erfolg versucht haben. Müsste ich etwas anderes verwenden, zum Beispiel die Verkettung? Schätze jede Hilfe, die ich dabei bekommen könnte.

Antwort

1

Hier ist eine Lösung, die Chaining verwendet:

let result = _.chain(data) 
    .pluck('list') 
    .flatten() 
    .pluck('type') 
    .uniq() 
    .value(); 

Dies wird durch erste plucking arbeitet die Listen aus den Daten und flattening sie. Dann wird der Typ aus der Liste ausgegeben, bevor schließlich uniq aufgerufen wird, um die eindeutigen Typen zu erhalten.

+0

Danke! Dieses ist perfekt! – dlimes

0

Sie können diese regelmäßig JS tun und reduce (sorry, ich bin nicht sehr vertraut mit Unterstrich, so dass ich dachte ich jetzt eine Vanille-Lösung bieten würde)

var uniqueValues = data.reduce(function(vals, d) { 
    return vals.concat(d.list.reduce(function(listVals, l) { 
     if (vals.indexOf(l.type) === -1 && listVals.indexOf(l.type) === -1) { 
      listVals.push(l.type) 
     } 

     return listVals; 
    }, [])) 
}, []) 

Demo: https://jsfiddle.net/0dsdm7Lu/

0
_.unique(_.flatten(_.map(myList, item => _.map(item.list, i => i.type)))); 

Underscore ist nicht das größte, wenn es um das Zusammenstellen von Funktionen geht, da es Daten zuerst nimmt. lodash-fp und ramda sind in dieser Hinsicht viel besser.

Arbeits Geige: https://jsfiddle.net/8eLk7t15/

+0

Leider ist dies nicht meine Wahl. Wenn es meine Wahl wäre, hätte ich Lodash gewählt (schließlich, weil ich gehört habe, dass es in vielerlei Hinsicht überlegen ist). Also muss ich mich zur Zeit mit der Unterstreichung beschäftigen. Ich mag den sauberen Look zu lodash obwohl, danke sowieso :( – dlimes

+0

Es ist eigentlich Unterstreichung. – adrice727

+0

Ich entschuldige mich, ich dachte, Sie lodash vorschlagen, und Bereitstellung von lodash-Code. Sollte näher auf Ihre Frage haben. Obwohl ich immer noch die Verkettung bevorzugen Methode verwendet durch angenommene Antwort. Danke Knospe! – dlimes

Verwandte Themen