2016-05-12 12 views
0

Ich versuche, die eindeutigen Elemente in jeder Spalte eines JSON-Array zu bekommen. Ich möchte dies konvertieren:Teilen eines jsonarray basierend auf Schlüssel mit lodash Unterstrich

var items = [{ "name": "Typ 1", "id": 13}, { "name": "Typ 2", "id": 14} , {"name": "Typ 3", "id": 14}, {"name": "Typ 3", "id": 13}, {"name": "Typ 2", "id": 12}, {"name": "Typ 3", "id": 12}];

in

[{ "Typ 1", "Typ 2", "Typ 3"}, {12,13,14}]

Das ist, was ich versucht

var uniq1 = _.map(_.uniqBy(items, 'id'), 'id'); 
var uniq2 =_.map(_.uniqBy(items, 'name'), 'name') 
console.log(uniq1,uniq2) 

Fiddle: https://jsfiddle.net/yogeshwaran/5ntfzss1/

Aber das scheint t o eine ineffiziente Lösung für meinen Anwendungsfall, da mein realer Datensatz viel größer ist (100000 Elemente mit 6 Schlüsseln in jedem Element). Gibt es eine Möglichkeit, alle eindeutigen Werte für jeden der Schlüssel zu erhalten. Ich möchte nicht jedes Mal über den gesamten Satz hinweg iterieren. Mein idealer Ansatz wäre: 1. Teilen Sie das Array basierend auf Tasten. 2. Dann finden Sie die eindeutige in jedem der Split. 3. Verbinden Sie die Ergebnisse.

Danke.

+0

Sie können entweder Vanille js oder eine neue verwenden js Sets (achten Sie auf Browser-Unterstützung), um effizienter zu arbeiten – juvian

+0

Machst du das im Browser für eine Webanwendung oder nur für die Verarbeitung von JSON-Daten? Wenn letzteres zutrifft, empfehle ich 'jq' für die Behandlung großer JSON-Datasets und hat viele nette [Hilfsfunktionen] (https://stedolan.github.io/jq/manual/#TypesandValues). – aug

Antwort

1

Sie können eine Kombination verwenden _.values() das Objekt Array zu konvertieren, _.zip() die Arrays umzusetzen und sie dann Karte mit _.uniq():

var items = [ 
 
    {"name": "Type 1","id": 13, "position": "manager"}, 
 
    {"name": "Type 2","id": 14, "position": "manager"}, 
 
    {"name": "Type 3","id": 14, "position": "manager"}, 
 
    {"name": "Type 3","id": 13, "position": "worker"}, 
 
    {"name": "Type 2","id": 12, "position": "worker"}, 
 
    {"name": "Type 3","id": 12, "position": "manager"} 
 
]; 
 

 
var result = _.zip.apply(_, items.map(_.values)).map(_.uniq); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.6/lodash.min.js"></script>

Verwandte Themen