55 votes

Fonction simple pour trier un tableau d'objets

Je voudrais créer une fonction (non anonyme) qui trie un tableau d'objets par ordre alphabétique par la clé name . Je ne code que du JavaScript pur et simple, donc les frameworks ne m'aident pas le moins du monde.

 var people = [
    {'name': 'a75', 'item1': false, 'item2': false},
    {'name': 'z32', 'item1': true,  'item2': false},
    {'name': 'e77', 'item1': false, 'item2': false}
];

143voto

David Brainer-Banker Points 3132

Que dis-tu de ça?

 var people = [
{
    name: 'a75',
    item1: false,
    item2: false
},
{
    name: 'z32',
    item1: true,
    item2: false
},
{
    name: 'e77',
    item1: false,
    item2: false
}];

function sort_by_key(array, key)
{
 return array.sort(function(a, b)
 {
  var x = a[key]; var y = b[key];
  return ((x < y) ? -1 : ((x > y) ? 1 : 0));
 });
}

people = sort_by_key(people, 'name');

Cela vous permet de spécifier la clé par laquelle vous souhaitez trier le tableau afin que vous ne soyez pas limité à un tri par nom codé en dur. Cela fonctionnera pour trier n'importe quel tableau d'objets qui partagent tous la propriété qui est utilisée comme clé. Je crois que c'est ce que tu cherchais ?

Et voici un jsFiddle : http://jsfiddle.net/6Dgbu/

32voto

pimvdb Points 66332

Vous pouvez trier un tableau ( [...] ) avec la fonction .sort :

 var people = [
    {'name': 'a75', 'item1': false, 'item2': false},
    {'name': 'z32', 'item1': true,  'item2': false},
    {'name': 'e77', 'item1': false, 'item2': false},
];

var sorted = people.sort(function IHaveAName(a, b) { // non-anonymous as you ordered...
    return b.name < a.name ?  1 // if b should come earlier, push a to end
         : b.name > a.name ? -1 // if b should come later, push a to begin
         : 0;                   // a and b are equal
});

9voto

Geuis Points 10333

Ce n'est pas une question JSON, en soi. C'est une question de tableau javascript.

Essaye ça:

 people.sort(function(a,b){ 
    var x = a.name < b.name? -1:1; 
    return x; 
});

5voto

Ryan Wibawa Points 31

J'ai modifié la réponse de @Geuis en utilisant lambda et je la convertis d'abord en majuscules :

 people.sort((a, b) => a.toLocaleUpperCase() < b.toLocaleUpperCase() ? -1 : 1);

4voto

Nate Getch Points 1129

Ma solution pour un problème de tri similaire en utilisant ECMA 6

 var library = [
        {name: 'Steve', course:'WAP', courseID: 'cs452'}, 
        {name: 'Rakesh', course:'WAA', courseID: 'cs545'},
        {name: 'Asad', course:'SWE', courseID: 'cs542'},
];

const sorted_by_name = library.sort( (a,b) => a.name > b.name );

for(let k in sorted_by_name){
    console.log(sorted_by_name[k]);
}

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