2016-12-11 1 views
6

Ich habe nach dieser Frage gesucht und keine vorhandene Antwort scheint zutreffen. Beachten Sie Folgendes:Wie sortiere Array von Objekten, wo Schlüssel Daten sind

[ 
    { 'August 17th 2016': [75] }, // 75 is the length of the array which contains up to 75 objects ... 
    { 'August 1st 2016': [5] }, 
    { 'August 28th 2016': [5] }, 
    ... 
] 

Was ist der beste Weg, um die Objekte in diesem Array von ihrem Datum zu sortieren und immer noch die „Englisch“ Darstellung ihrer wichtigsten?

Hinweis: Der Schlüssel wird als Diagrammbeschriftung verwendet.

Überall wo ich hinschaue array.sort wird verwendet, aber das ist auf den Objektschlüssel von sagen created_at.

sollte das Ergebnis sein:

[ 
    { 'August 1st 2016': [5] }, 
    { 'August 17th 2016': [75] } 
    { 'August 28th 2016': [5] }, 
    ... 
] 

Ich bin nicht sicher, wie ich etwas nicht fortfahren, so müssen zeigen.

+0

Vielleicht ein Duplikat? http://stackoverflow.com/questions/979256/sorting-an-array-of-avascript-objects – tbg

+0

Mögliches Duplikat von [Sortierung geschachtelte Arrays von Objekten nach Datum] (http://stackoverflow.com/questions/9293290/sorting -nested-arrays-of-objects-by-date) – Shaffanhoon

+2

Keines davon sind richtige Duplikate, die er nach Schlüssel sortieren möchte. –

Antwort

6

Dies kann mithilfe des Objektschlüssels date.parse erreicht werden. Ich nahm den ersten Objektschlüssel, wie es scheint, es gibt nur 1 in jedem Eintrag des Arrays. Der schwierige Teil ist, dass date.parse nicht auf "12." oder "1." funktioniert, also müssen wir vorübergehend "th" oder "st" durch eine , ersetzen. Auf diese Weise funktioniert date.parse auf der Zeichenfolge.

var dates = [{ 
 
    'August 17th 2016': [75] 
 
}, { 
 
    'August 1st 2016': [5] 
 
}, { 
 
    'August 28th 2016': [5] 
 
}] 
 

 
const replaceOrdinals = o => { 
 
    return Object.keys(o)[0].replace(/\w{2}(\d+$)/, ',$1'); 
 
} 
 

 
dates = dates.sort((a, b) => { 
 
    return Date.parse(replaceOrdinals(a)) - Date.parse(replaceOrdinals(b)) 
 
}); 
 

 
console.log(dates);

Beachten Sie:

Von @adeneo in den Kommentaren: Date.parse ist implentation abhängig. Sie werden wahrscheinlich die Dokumentation durchlesen müssen, um festzustellen, ob Dinge wie Zeitzonen Dinge durcheinander bringen. Als eine sicherere Methode können Sie etwas wie moment.js für die Datumsanalyse verwenden.

+1

Es sollte angemerkt werden, dass "Date.parse" implementationsabhängig ist und in einigen Implementierungen überhaupt nicht an diesen Datumszeichenfolgen arbeiten muss. – adeneo

+0

Kannst du das erklären: 'replaceOrdinals = o =>' Was machen wir hier? @KevBot – TheWebs

+0

@TheWebs, es ist eine ['Pfeilfunktion'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions). Die ES5-Version wäre: 'var replaceOrdinals = function (o) {...}'. In diesem Fall benötige ich nur ein Argument, also wird das '()' nicht um das 'o' benötigt. Das '=>' ist nur ein Teil der Syntax, obwohl es je nachdem, ob Sie unmittelbar danach geschweifte Klammern verwenden, verschiedene Dinge tun kann. Diese Dinge werden in diesem Link erklärt. Beantwortet das deine Frage? – KevBot

0

Die Lösung in der answer by Kevbot ist elegant, aber ihre Anwendung beschränkt sich auf ES6-Browser mit einer Implementierung von date.parse(), die dem vom OP verwendeten spezifischen Datumsformat entspricht.

Statt eine Bibliothek wie moment.js nur die date.parse() Abhängigkeit zu vermeiden hinzuzufügen, eine maßgeschneiderte Lösung, die in jeder JavaScript-Umgebung (einschließlich altem Browser) funktionieren kann mit nur wenigen Zeilen Code vorgenommen werden:

var dates = [ 
 
    {'August 17th 2016': [75]}, 
 
    {'August 1st 2016': [5]}, 
 
    {'August 28th 2016': [5]} 
 
]; 
 

 
dates.sort(function(a, b){ 
 
    var i, j; 
 
    for(i in a); //get datestring a 
 
    for(j in b); //get datestring b; 
 
    return MMMDDYYYYtoSortableNumber(i) - 
 
    MMMDDYYYYtoSortableNumber(j); 
 
}); 
 

 
console.log(dates); 
 

 
// MMMDDYYYYtoSortableNumber() converts datestrings 
 
// such as "April 5th 1969" to 19690405. 
 
// Month name to digit approach adapted from 
 
// https://gist.github.com/atk/1053863 
 
    
 
function MMMDDYYYYtoSortableNumber(datestring) { 
 
    var mdy = datestring.match(/\w(\w\w)\D+(\d+)\D+(\d+)/); 
 
    return mdy[3] * 10000 + 
 
    ' anebarprayunulugepctovec'.search(mdy[1]) * 50 + 
 
    mdy[2] * 1; 
 
}

Bitte beachten sie, dass es sicherer sein könnte, die datestrings als Objektwerte eher als Objektschlüssel darzustellen. Sie sind dann leichter zu extrahieren (und schneller zugänglich). Z.B.

{label: 'August 17th 2016', data: [75]}, 
Verwandte Themen