Как отсортировать массив объектов по их свойствам?

Рейтинг: 3Ответов: 2Опубликовано: 16.09.2014
var a = {prop: 3, name: 'a'},
    b = {prop: 2, name: 'b'},
    c = {prop: 1, name: 'c'};

var array = [ a, b, c ],
    result = null;

result = array.sort(function(a, b){
    var c = a.prop,
        d = b.prop;

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

    return 0;
});

for(var i in result){
    console.log(result[i].name); // a, b, c
}

Так не работает...

Добавлено:
А в js так нельзя сортировать?? А какая разница сорту, что двигать местами?

Ответы

▲ 3Принят

У вас две ошибки:

  1. Метод sort сортирует массив на месте, т.е. изменяет массив, к которому он применен. Если вы хотите сохранить исходный массив, сделайте копию перед сортировкой:

    result = array.slice().sort()

  2. Вы используете b в сравнениях (c < b) и (c > b), хотя хотели d.

Исправленная программа работает как надо.

▲ 2

В принципе многомерные сортировки решаются с помощью написания сложных функций для sort(), но это сложно, поэтому можно воспользоваться какой-нибудь библиотекой, например, эта функция может быть реализована с помощью библиотеки Alasql, которая предназначена для обработки массивов как в SQL.

var a = {prop: 3, name: 'a'},
    b = {prop: 2, name: 'b'},
    c = {prop: 1, name: 'c'};
var array = [ a, b, c ];

var result = alasql('SELECT * FROM ? ORDER BY name',[array]);

Порядок и количество полей можно варьировать с помощью ключевых слов ASC (по возрастанию)/DESC (по убыванию), например, так:

var result = alasql('SELECT * FROM ? ORDER BY name DESC, prop ASC',[array]);

Ваш пример на jsFiddle.