Страницы

Поиск по вопросам

вторник, 17 марта 2020 г.

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

#javascript


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 так нельзя сортировать?? А какая разница сорту, что двигать местами?    


Ответы

Ответ 1



У вас две ошибки: Метод sort сортирует массив на месте, т.е. изменяет массив, к которому он применен. Если вы хотите сохранить исходный массив, сделайте копию перед сортировкой: result = array.slice().sort() Вы используете 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.

Ответ 3



var a = {prop: 3, name: 'a'}, b = {prop: 2, name: 'b'}, c = {prop: 1, name: 'c'}, array = [ a, b, c ]; for (var i=0; i < array.sort(function(obj1, obj2){ return obj1.prop-obj2.prop; }).length; i++) { console.log(array[i].prop); }

Комментариев нет:

Отправить комментарий