325 votes

Trier un tableau d'objets par clé unique avec valeur de date

J'ai un tableau d'objets avec plusieurs paires clé-valeur, et j'ai besoin de les trier sur la base de "updated_at" :

[
    {
        "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"
    }
]

Quelle est la manière la plus efficace de le faire ?

1voto

marcobiedermann Points 850
  • Utilisez Array.sort() pour trier un tableau
  • Cloner le tableau en utilisant opérateur de diffusion ( ) pour rendre la fonction pure
  • Trier par la clé souhaitée ( updated_at )
  • Convertir une chaîne de date en objet date
  • Array.sort() fonctionne en soustrayant deux propriétés de l'élément actuel et de l'élément suivant s'il s'agit d'un nombre / objet sur lequel vous pouvez effectuer des opérations arythmiques

    const input = [ { 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', } ];

    const sortByUpdatedAt = (items) => [...items].sort((itemA, itemB) => new Date(itemA.updated_at) - new Date(itemB.updated_at));

    const output = sortByUpdatedAt(input);

    console.log(input); / [ { 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' } ] / console.log(output) / [ { updated_at: '2012-01-01T06:25:24Z', foo: 'bar' }, { updated_at: '2012-01-05T04:13:24Z', foo: 'bar' }, { updated_at: '2012-01-09T11:25:13Z', foo: 'bar' } ] /

0voto

Michael Guild Points 726

Vous pouvez créer une fermeture et la transmettre de cette manière Voici mon exemple de fonctionnement

$.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));
});

0voto

Prasad Points 655
var months = [
    {
        "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"
    }];
months.sort((a, b)=>{
    var keyA = new Date(a.updated_at),
        keyB = new Date(b.updated_at);
    // Compare the 2 dates
    if(keyA < keyB) return -1;
    if(keyA > keyB) return 1;
    return 0;
});
console.log(months);

0voto

Idan Points 85

Je suis confronté à la même chose, donc je gère cela avec un pourquoi générique et je construis une fonction pour cela :

//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;
    })
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X