2017-03-10 9 views
0

ich ein JSON-Objekt wie diese:Sortieren nach Datum multidimensionale Objekt

"value": { 
    "date": { 
     "2017-03-10": { 
      "0": { 
       "buy": 0, 
       "sell": 0 
      }, 
      "1": { 
       "buy": 0, 
       "sell": 0 
      }, 
      "2": { 
       "buy": 0, 
       "sell": 0 
      }, 
     }, 
    },} 

Ich habe alle Termine in: Multi_Obj [ "Wert"] [ "date"];

und wenn ich den Befehl sort verwenden:

Multi_Obj["value"]["date"].sort(function(a, b) { 
a = new Date(a.dateModified); 
b = new Date(b.dateModified); 
return a>b ? -1 : a<b ? 1 : 0;}); 

Ich habe dieses Ergebnis:

Uncaught Typeerror: Multi_Obj.show_data.sort ist keine Funktion.

Bitte helfen Sie mir! :)

+0

Art kann die Verwendung mit Array nicht mit dem Objekt –

+0

'Multi_Obj.value.date.sort (function (a, b) {' –

+1

Der Schlüssel des Objekte können nicht bestellt werden.Was Sie hier versuchen ist nicht möglich –

Antwort

0

Sie können assoziierte Arrays nicht sortieren, weil sie in JavaScript eingebaut sind, aber Sie können es sortieren, wenn Sie es in ein Tupel konvertieren. Also, wenn Sie verwendet haben:

colorPreference = {"favorate":"blue","hate","red"} 

Die Tupel Version wäre:

colorPreference = [["favorate","blue"],["hate","red"]] 

Sie haben noch beide die Schlüssel und den Wert, aber jetzt ist es in einem Array-basierten Format, das tut erzwingen Reihenfolge. Zugehörige Arrays nicht Erzwingen Reihenfolge der Elemente.

Also, was macht unsere JavaScript wie dann aussehen:

function toTuples(assocArray) { 
    var tuples = []; 
    for (var key in assocArray) tuples.push([key, assocArray[key]]); 
    return tuples; 
} 

console.log(toTuples(Multi_Obj["value"]["date"]).sort(function(a, b) { 
    a = new Date(a[0]); 
    b = new Date(b[0]); 
    return a>b ? -1 : a<b ? 1 : 0; 
})); 

Wenn Sie sich fragen, kann man nicht wirklich es zurück konvertieren, denn dann würde der Auftrag nicht erhalten. Aber man kann immer noch eine Schleife durch sie:

for (var i = 0, len = output.length; i < len; i++) { 
    key = output[i][0]; 
    value = output[i][1]; 
} 
0

Sie should not rely on a certain order von Objekteigenschaften, obwohl einige neuere ES6 Methoden wird eine gewisse Ordnung garantieren, aber nicht von Ihnen willkürlich mit einem Aufruf an sort einstellen.

Sie könnten stattdessen eine ES6 Map erstellen, die ähnlich wie ein einfaches Objekt funktioniert, aber die Einfügung Reihenfolge behält. Diese Sie verwenden können, wie folgt:

const obj = { 
 
    "value": { 
 
     "date": { 
 
      "2017-12-01": "a", 
 
      "2017-03-10": "b", 
 
      "2017-05-20": "c", 
 
      "2016-01-01": "d" 
 
     } 
 
    } 
 
}; 
 

 
// Convert date property to a sorted Map: 
 
obj.value.date = Object.keys(obj.value.date) 
 
    .sort((a, b) => Date.parse(a) - Date.parse(b)) 
 
    .reduce((mp, a) => mp.set(a, obj.value.date[a]), new Map); 
 

 
// Display results (sorted): 
 
obj.value.date.forEach((value, date) => console.log(date, value));

Beachten Sie, dass die Syntax mit einer Karte zu verwenden, ist ein bisschen anders. Um einen bestimmten Eintrag zu erhalten, würden Sie die get Methode verwenden:

obj.value.date.get('2017-03-10')