2017-06-19 1 views
-1

sagen Lets ich eine json Resul wie diese:Populate Array mit Werten aus einem anderen Sub-Array

{ 
    "results": [{ 
     "id": 1, "name": "test1" 
    }, 
    { 
     "id": 2, "name": "test2", 
     "tags": [{"name": "car"},{ "name": "love"}] 
    }, 
    { 
     "id": 3, "name": "test3", 
     "tags": [{"name": "car"},{"name": "bike"},{"name": "motorcycle"}] 
    } 
    ] 
} 

Ich mag ein neues Array montieren nur mit den einzigartigen Tags, in diesem Beispiel würde Auto, Liebe, Fahrrad, Motorrad.

Manchmal Tags null oder leer ist ...

Wäre eine Möglichkeit haben, dies ohne Schleifen zu tun? Jquery oder Unterstrich würde das passen? könnte mit reinem Javascript getan werden?

prost

+0

Wie funktioniert sieht das zweite Array aus? (die, die Sie zu diesem Array hinzufügen möchten) – Max08

+0

@ Max08 nur mit dem Tag-Namen, [{"name": "Liebe"}, {"Name": "Fahrrad"}] – 2Fast4YouBR

+0

@ 2Fast4YouBR Hinzugefügt eine Lodash-Lösung, wenn Sie bin interessiert. – mhodges

Antwort

1

Da Sie underscore gefragt, ich werde Ihnen eine lodash Lösung bieten (da lodash Strich effektiv ersetzt wurde). Sie können lodash dies zu erreichen, verwenden, um einen funktionellen Ansatz mit in Verfahren gebaut, etwa so:

  • _.flatMap() - mit Haltewert innerhalb Objekts durch Eigenschaft in ein einziges Array und abflachen alle verschachtelten Arrays

  • _.compact() - entfernen Sie alle false, null, 0, "", undefined und NaN

  • _.map() - wie oben, ohne (keine Notwendigkeit, er Abflachung re)

  • _.uniq() - Rückkehr nur eindeutige Werte

var data = { 
 
    "results": [{ 
 
     "id": 1, "name": "test1" 
 
    }, 
 
    { 
 
     "id": 2, "name": "test2", 
 
     "tags": [{"name": "car"},{ "name": "love"}] 
 
    }, 
 
    { 
 
     "id": 3, "name": "test3", 
 
     "tags": [{"name": "car"},{"name": "bike"},{"name": "motorcycle"}] 
 
    } 
 
    ] 
 
}; 
 

 
var uniq = _.uniq(_.map(_.compact(_.flatMap(data.results, "tags")), "name")); 
 
console.log(uniq);
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>

Alternativ können Sie die Anweisungen verketten, anstatt sie nisten (aus Gründen der Lesbarkeit) unter Verwendung _.chain(), wie folgt:

var uniq = _ 
    .chain(data.results) 
    .flatMap("tags") 
    .compact() 
    .map("name") 
    .uniq() 
    .value(); // [ 'car', 'love', 'bike', 'motorcycle' ] 
1
const tagSet = new Set (      // use ES6 set to get rid of duplicates 
    obj.results 
     .filter(r => r.hasOwnProperty('tags')) // check for tags property 
     .map(r => r.tags)      // extract array of array of tag obj 
     .reduce((a, b) => a.concat(b), [])  // flatten into array of obj 
     .map(flat => flat.name)    // extract name property 
); 
const uniques = [...tagSet];     // convert back into array 

console.log(uniques); // [ 'car', 'love', 'bike', 'motorcycle' ] 
Verwandte Themen