379 Stimmen

Array von Objekten nach einem einzelnen Schlüssel mit Datumswert sortieren

Ich habe ein Array von Objekten mit mehreren Schlüssel-Wert-Paaren, und ich muss sie basierend auf "updated_at" sortieren:

[
    {
        "updated_at" : "2012-01-01T06:25:24Z",
        "foo" : "bar"
    },
    {
        "updated_at" : "2012-01-09T11:25:13Z",
        "foo" : "bar"
    },
    {
        "updated_at" : "2012-01-05T04:13:24Z",
        "foo" : "bar"
    }
]

Was ist der effizienteste Weg, dies zu tun?

1voto

kennebec Punkte 98551

Die Sortierung nach einem ISO-formatierten Datum kann sehr aufwendig sein, es sei denn, Sie beschränken die Clients auf die neuesten und besten Browser, die den korrekten Zeitstempel durch Date-parsing der Zeichenkette erstellen können.

Wenn Sie sicher Ihrer Eingaben, und Sie wissen es wird immer yyyy-mm-ddThh:mm:ss und GMT (Z) sein Sie können die Ziffern aus jedem Glied extrahieren und sie wie ganze Zahlen vergleichen

array.sort(function(a,b){
    return a.updated_at.replace(/\D+/g,'')-b.updated_at.replace(/\D+/g,'');
});

Wenn das Datum anders formatiert werden kann, müssen Sie vielleicht etwas für Leute mit Iso-Problemen hinzufügen:

Date.fromISO: function(s){
    var day, tz,
    rx=/^(\d{4}\-\d\d\-\d\d([tT ][\d:\.]*)?)([zZ]|([+\-])(\d\d):(\d\d))?$/,
    p= rx.exec(s) || [];
    if(p[1]){
        day= p[1].split(/\D/).map(function(itm){
            return parseInt(itm, 10) || 0;
        });
        day[1]-= 1;
        day= new Date(Date.UTC.apply(Date, day));
        if(!day.getDate()) return NaN;
        if(p[5]){
            tz= (parseInt(p[5], 10)*60);
            if(p[6]) tz+= parseInt(p[6], 10);
            if(p[4]== '+') tz*= -1;
            if(tz) day.setUTCMinutes(day.getUTCMinutes()+ tz);
        }
        return day;
    }
    return NaN;
}
if(!Array.prototype.map){
    Array.prototype.map= function(fun, scope){
        var T= this, L= T.length, A= Array(L), i= 0;
        if(typeof fun== 'function'){
            while(i< L){
                if(i in T){
                    A[i]= fun.call(scope, T[i], i, T);
                }
                ++i;
            }
            return A;
        }
    }
}
}

0voto

Legion Punkte 73

Der Vollständigkeit halber ist hier eine mögliche kurze generische Implementierung von sortBy:

function sortBy(list, keyFunc) {
  return list.sort((a,b) => keyFunc(a) - keyFunc(b));
}

sortBy([{"key": 2}, {"key": 1}], o => o["key"])

Beachten Sie, dass dies die Sortiermethode für Arrays verwendet, die an Ort und Stelle sortiert. Für eine Kopie können Sie arr.concat() oder arr.slice(0) oder eine ähnliche Methode verwenden, um eine Kopie zu erstellen.

-1voto

Michael Guild Punkte 790

Sie können einen Abschluss erstellen und ihn auf diese Weise übergeben Hier ist mein Arbeitsbeispiel

$.get('https://data.seattle.gov/resource/3k2p-39jp.json?$limit=10&$where=within_circle(incident_location, 47.594972, -122.331518, 1609.34)', 
  function(responce) {

    var filter = 'event_clearance_group', //sort by key group name
    data = responce; 

    var compare = function (filter) {
        return function (a,b) {
            var a = a[filter],
                b = b[filter];

            if (a < b) {
                return -1;
            } else if (a > b) {
                return 1;
            } else {
                return 0;
            }
        };
    };

    filter = compare(filter); //set filter

    console.log(data.sort(filter));
});

-1voto

Idan Punkte 2456

Ich konfrontiert mit der gleichen Sache, so dass ich dies mit einem generischen warum behandeln und ich bauen eine Funktion für diese:

//example:
//array: [{name: 'idan', workerType: '3'}, {name: 'stas', workerType: '5'}, {name: 'kirill', workerType: '2'}]
//keyField: 'workerType'
// keysArray: ['4', '3', '2', '5', '6']
sortByArrayOfKeys = (array, keyField, keysArray) => {
    array.sort((a, b) => {
        const aIndex = keysArray.indexOf(a[keyField])
        const bIndex = keysArray.indexOf(b[keyField])
        if (aIndex < bIndex) return -1;
        if (aIndex > bIndex) return 1;
        return 0;
    })
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X