web-dev-qa-db-fra.com

Fonction simple pour trier un tableau d'objets

J'aimerais créer une fonction (non anonyme) qui trie un tableau d'objets par ordre alphabétique à l'aide de la clé name. Je ne code que du code JavaScript direct afin que 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}
];
31
John

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 sortByKey(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 = sortByKey(people, 'name');

Cela vous permet de spécifier la clé selon laquelle vous souhaitez trier le tableau afin de ne pas vous limiter à un tri de nom codé en dur. Cela fonctionnera pour trier n'importe quel tableau d'objets partageant 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/

104
David Brainer

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
});
25
pimvdb

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; 
});
8
Geuis

J'ai modifié la réponse de @Geuis en utilisant lambda et le converti en majuscule en premier:

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

var data = [ 1, 2, 5, 3, 1]; data.sort(function(a,b) { return a-b });

Avec un petit compartiment et en utilisant le tri, nous pouvons le faire

1
iknowsomething

Ma solution pour un problème de tri similaire avec 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]);
}

1
Nate Getch
Array.prototype.sort_by = function(key_func, reverse=false){
    return this.sort( (a, b) => ( key_func(b) - key_func(a) ) * (reverse ? 1 : -1) ) 
}

Alors par exemple si nous avons

var arr = [ {id: 0, balls: {red: 8,  blue: 10}},
            {id: 2, balls: {red: 6 , blue: 11}},
            {id: 1, balls: {red: 4 , blue: 15}} ]

arr.sort_by(el => el.id, reverse=true)
/* would result in
[ { id: 2, balls: {red: 6 , blue: 11 }},
  { id: 1, balls: {red: 4 , blue: 15 }},
  { id: 0, balls: {red: 8 , blue: 10 }} ]
*/

ou

arr.sort_by(el => el.balls.red + el.balls.blue)
/* would result in
[ { id: 2, balls: {red: 6 , blue: 11 }},    // red + blue= 17
  { id: 0, balls: {red: 8 , blue: 10 }},    // red + blue= 18
  { id: 1, balls: {red: 4 , blue: 15 }} ]   // red + blue= 19
*/
0
aljgom