2017-01-11 1 views
1

Ich versuche, eine Tabelle mit einem Vergleich einiger Elemente anzuzeigen. Die Idee ist, in der richtigen Art und Weise (weniger auf der linken Seite und vollständigere auf der rechten Seite), wie zu sortieren:JSon nach Requisiten von Kindelementen sortieren (Vergleichstabelle)

   Plan1 | Plan2 | Plan3 
item1   X  X   X 
item2   -  X   X 
item3   -  -   X 

Aber die API unseres Anbieters dient der json ungeordnet. Das Problem ist, dass wir mehr als 100 Elemente und fast 20 Pläne haben, so dass es unmöglich ist, auf "Hardcode" zu filtern.

Die json ist kolossal, so die einfache Version nicht mit dem Minimum (wie in diesem Beispiel) wäre:

[ 
    { 
     "Id": "1", 
     "Name": "Item1", 
     "Plans": [ 
      { 
       "PlanMaster": "EPTV Max", 
       "IdPlan": 1000, 
       "HasPlan": true 
      }, 
      { 
       "PlanMaster": "EPTV", 
       "IdPlan": 1001, 
       "HasPlan": true 
      }, 
      { 
       "PlanMaster": "Web TV", 
       "IdPlan": 1002, 
       "HasPlan": true 
      } 
     ] 
    }, 
    { 
     "Id": "2", 
     "Name": "Item2", 
     "Plans": [ 
      { 
       "PlanMaster": "EPTV Max", 
       "IdPlan": 1000, 
       "HasPlan": false 
      }, 
      { 
       "PlanMaster": "EPTV", 
       "IdPlan": 1001, 
       "HasPlan": true 
      }, 
      { 
       "PlanMaster": "Web TV", 
       "IdPlan": 1002, 
       "HasPlan": true 
      } 
     ] 
    }, 
    { 
     "Id": "3", 
     "Name": "Item3", 
     "Plans": [ 
      { 
       "PlanMaster": "EPTV Max", 
       "IdPlan": 1000, 
       "HasPlan": false 
      }, 
      { 
       "PlanMaster": "EPTV", 
       "IdPlan": 1001, 
       "HasPlan": false 
      }, 
      { 
       "PlanMaster": "Web TV", 
       "IdPlan": 1002, 
       "HasPlan": true 
      } 
     ] 
    } 
] 

Der Punkt ist, wie kann ich durch die json navigieren paar Dinge zu fragen wie „Wie viele Pläne habe ich "," Liste Pläne in der Reihenfolge von weniger itens zu mehr ", etc ...

Wie wird diese Art von" Sortierung "/" Vergleich "Problem genannt? Ich habe versucht, Google zu sortieren, etc ... und konnte nicht viel finden. Ich möchte nur wissen, wie kann ich die Knoten in Javascript abfragen, so dass ich in der Lage wäre, die Logik zu implementieren.

prost

+0

Sie müssen Ihren eigenen Sortieralgorithmus/Logik erstellen, der in der [.sort] gekapselt ist (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ sort) Array-Methode, zum Beispiel. – mrlew

Antwort

1

Sie könnten die Pläne als Binärzahl behandeln und als Sortierkriterium verwenden.

var data = [{ "Id": "1", "Name": "Item1", "Plans": [{ "PlanMaster": "EPTV Max", "IdPlan": 1000, "HasPlan": true }, { "PlanMaster": "EPTV", "IdPlan": 1001, "HasPlan": true }, { "PlanMaster": "Web TV", "IdPlan": 1002, "HasPlan": true }] }, { "Id": "2", "Name": "Item2", "Plans": [{ "PlanMaster": "EPTV Max", "IdPlan": 1000, "HasPlan": false }, { "PlanMaster": "EPTV", "IdPlan": 1001, "HasPlan": true }, { "PlanMaster": "Web TV", "IdPlan": 1002, "HasPlan": true }] }, { "Id": "3", "Name": "Item3", "Plans": [{ "PlanMaster": "EPTV Max", "IdPlan": 1000, "HasPlan": false }, { "PlanMaster": "EPTV", "IdPlan": 1001, "HasPlan": false }, { "PlanMaster": "Web TV", "IdPlan": 1002, "HasPlan": true }] }]; 
 

 
data.sort(function (a, b) { 
 
    function getRange(o) { 
 
     var r = o.Plans.reduce(function (r, a) { 
 
       return r * 2 + !a.HasPlan; 
 
      }, 0); 
 
     
 
     o.r = r; // just to show what's happen 
 
     return r; 
 
    } 
 

 
    return getRange(a) - getRange(b); 
 
}); 
 

 
console.log(data)
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

Arbeitete wie ein Charme! Ich habe ein paar mehr Itens in anderer Reihenfolge und es richtig sortiert. Danke Nina! – 2Fast4YouBR

1

Sie können eine generische Funktion definieren, die ein Array auf einige key Funktion basierend sortiert:

let sortBy = (a, key) => a 
    .map(x => [key(x), x]) 
    .sort((x, y) => x[0] > y[0] ? 1 : x[0] < y[0] ? -1 : 0) 
    .map(x => x[1]); 

dann einige aufgabenspezifische Tastenfunktionen schreiben, zum Beispiel:

let numberOfPlans = item => item.Plans.filter(x => x.HasPlan).length; 

und übergebe sie an sortBy:

let sortedData = sortBy(data, numberOfPlans); 

Eine andere (und vielleicht bessere) Option wäre das Laden dieser Daten in eine relationale Datenbank (z. sqlite) und nutzen Sie die ganze Kraft von SQL, um alles zu finden, was Sie brauchen.

1

Du wirst eine Schleife entweder Weg, um zu verwenden. Wenn Ihr JSON so groß ist, wie Sie es sich vorstellen, ist Effizienz ein Problem. Sie müssen alles tun, um die Effizienz zu steigern.

Wenn jedoch Ihr JSON 100 Elemente hat (wie Sie sagen) ist das wirklich nicht so groß von einem Datensatz. Ein Datensatz mit Millionen von Zeilen? Sicher. Aber ein paar Hundert oder sogar ein paar Tausend werden wahrscheinlich auch kein großes Problem darstellen (offensichtlich ist das auch ein Produkt davon, wie viele verschachtelte Eigenschaften in jedem Element Ihres Datasets enthalten sind).

Soweit ‚Navigation“ die JSON, Sie müssen durch sie einfach Schleife als Objekte und vermeiden so viele Accessoren wie möglich (Cache-Lookups, etc).

Ich bin selten ein Fan von Hard- Coding überprüft, wo eine Schleife wäre besser, aber bedenken Sie für Perf, dass in einigen Fällen ist dies akzeptabel, wenn Sie absolut wissen, was Ihr Datensatz ist, und die Perf Vorteile überwiegen die Wartung Vorteile.

Ein Beispiel für etwas, das mehr perf-freundlich, aber weniger wartungsfreundlich ist:

var i; 
var j; 
//Set up a 2-dimensional array where each array index represents the number of plans that each of it's members has. In this case, numPlans[0] contains all items that contain 0 plans, etc. 
var plans = [[], [], []]; 
//Don't re-create variables on every loop, just re-assign 
var item; 
var numPlans; 
var p; 

for(i = 0; i < data.length; i++){ 
    item = data[i]; 
    p = item.Plans; 
    numPlans = 0; 
    for(j = 0; j < p.length; j++) { 
     if(p[j].HasPlan) { 
      numPlans++; 
     } 
    } 
    plans[numPlans].push(item); 
} 

Dies ist nicht getestet, aber es ist ein grober Entwurf ziemlich perf orientierten Ansatz.