2017-03-21 7 views
0
records = [ 
     { 
      name: "Alpha", 
      set: 5, 
      weight: 185 
     },  
     { 
      name: "Alpha", 
      set: 5, 
      weight: 350 
     },   
     { 
      name: "Bravo", 
      set: 5, 
      weight: 185 
     },   
     { 
      name: "Charlie", 
      set: 5, 
      weight: 185 
     },   
     { 
      name: "Delta", 
      set: 5, 
      weight: 185 
     } 
] 

Ich habe ein JSON-Array mit mehreren Datensätzen, und ich muss diese Datensätze nach Name und Gewicht filtern. Da es zum Beispiel zwei "Alpha" -Datensätze gibt, muss ich nur die mit dem höchsten Gewicht einziehen (was der zweite Datensatz wäre). Ich habe keine Ahnung, wie man dieses Array mit den gewünschten Ergebnissen filtert und neu erstellt.Filtern und Sortieren eines JSON-Arrays

Ich muss das ursprüngliche Array intakt lassen, da ich ALLE in einer Tabelle anzeigen werde, aber ich muss ein sekundäres Array mit nur den Objekten mit dem größten Wert erstellen, namentlich.

+0

diese ähnliche Frage finden: http://stackoverflow.com/a/17037756/6449750 –

Antwort

1

Ich empfehle Ihnen mit lodash beginnen und nicht Zeit damit verbringen, eigene Funktionen zu erstellen. Beispiel: Ihr Array nach Namen sortieren Sie den folgenden Code schreiben sollte:

var records = [ 
     { 
      name: "Alpha", 
      set: 5, 
      weight: 185 
     },  
     { 
      name: "Alpha", 
      set: 5, 
      weight: 350 
     },   
     { 
      name: "Bravo", 
      set: 5, 
      weight: 185 
     },   
     { 
      name: "Charlie", 
      set: 5, 
      weight: 185 
     },   
     { 
      name: "Delta", 
      set: 5, 
      weight: 185 
     } 
]; 
var sorted = _.sortBy(records, ['name']); 

und zweiten Fall nach Name und Gewicht filtern

var filtered = _.filter(records, [ 'name': 'Alpha', 'weight': 350 ]); 
+0

Sie auch [Funktion] passieren kann (https://lodash.com/docs/4.17.4#sortBy) –

+0

Werden mehrere Typen desselben Typs herausgefiltert? Da dies ist etwas, was OP will –

+0

für Filter [verwenden] (https://lodash.com/docs/4.17.4#filter) –

3

ich eine funktionale Programmierung Ansatz empfehlen:

var newRecords = records 
    .filter(function(record) { 
     return records.find(function(innerRecord) { 
      return innerRecord.name === record.name && innerRecord.weight > record.weight; }) === undefined; 
    }); 

In diesem Beispiel geben Sie nur Datensätze, in denen Sie keinen Datensatz teilen den gleichen Namen, aber mit einem größeren Gewicht finden. Außerdem wird Ihr neu erstelltes Array in newRecords gespeichert, wobei das ursprüngliche Array intakt bleibt.

2

Dies sortiert zuerst die Elemente in der Reihenfolge der Namen und der Gewichtung und filtert dann alle bis auf die ersten Elemente heraus.

var records = [{ 
 
    name: "Alpha", 
 
    set: 5, 
 
    weight: 185 
 
    }, 
 
    { 
 
    name: "Alpha", 
 
    set: 5, 
 
    weight: 350 
 
    }, 
 
    { 
 
    name: "Bravo", 
 
    set: 5, 
 
    weight: 185 
 
    }, 
 
    { 
 
    name: "Charlie", 
 
    set: 5, 
 
    weight: 185 
 
    }, 
 
    { 
 
    name: "Charlie", 
 
    set: 5, 
 
    weight: 200 
 
    }, 
 
    { 
 
    name: "Delta", 
 
    set: 5, 
 
    weight: 185 
 
    } 
 
] 
 

 
console.log(
 
    records.sort((a, b) => { 
 
    if (a.name === b.name) { 
 
     return a.weight >= b.weight ? -1 : 1 
 
    } 
 
    return a.name > b.name ? 1 : -1 
 
    }) 
 
    .filter((rec, i, arr) => { 
 
    if (i === 0) return true 
 
    return rec.name !== arr[i - 1].name 
 
    }) 
 
)

4

Sie lodash 4+ für diese verwenden können.

var sortierteArray = _.orderBy (records, ['weight'], ['desc']);

Dies sortiert das Array nach Gewicht. Dann _.uniqBy (sortedArray, 'Name')

Dies wird die endgültige Anordnung zurückzukehren.

var records = [ 
     { 
      name: "Alpha", 
      set: 5, 
      weight: 185 
     },  
     { 
      name: "Alpha", 
      set: 5, 
      weight: 350 
     },   
     { 
      name: "Bravo", 
      set: 5, 
      weight: 185 
     },   
     { 
      name: "Charlie", 
      set: 5, 
      weight: 185 
     },   
     { 
      name: "Delta", 
      set: 5, 
      weight: 185 
     } 
] 

var sortedArray = _.orderBy(records, ['weight'], ['desc']) 

_.uniqBy(sortedArray,'name') 
Verwandte Themen