У меня есть объект JSON, который я хочу сначала отсортировать по одному ключу, а затем по второму ключу, аналогичному упорядочиванию по двум столбцам в SQL. Вот образец JSON, который у меня был бы:

{
   "GROUPID":3169675,
   "LASTNAME":"Chantry"
}

Я хочу упорядочить все результаты по GROUPID, а затем по LASTNAME. Я использовал функцию сортировки JSON для сортировки по одному ключу, но не по нескольким.

Любая помощь была бы велика.

11
Scott Chantry 12 Июл 2010 в 20:02

2 ответа

Лучший ответ

Предполагая, что у вас есть массив объектов:

var data = [
    { "GROUPID":3169675, "LASTNAME":"Chantry" },
    { "GROUPID":3169612, "LASTNAME":"Doe" },
    ...
];

Вы можете использовать настраиваемый компаратор для сортировки. Чтобы отсортировать сначала по GROUPID, а затем по LASTNAME, логика сравнения двух объектов будет следующей:

if GROUPID of first is smaller than second
    return -1;
else if GROUPID of first is larger than second
    return 1;
else if LASTNAME of first is smaller than second
    return -1;
else if LASTNAME of first is larger than second
    return 1;
else
    return 0;

Чтобы отсортировать массив объектов, используйте описанный выше алгоритм и вызовите метод сортировки массива. После завершения сортировки элементы data должны быть отсортированы в требуемом порядке.

data.sort(function(a, b) {
    // compare a and b here using the above algorithm
});

Вот еще один очень похожих вопрос я ответил недавно. Это касается сортировки по нескольким столбцам с помощью jQuery, но вы можете легко удалить часть jQuery. В нем представлены некоторые настраиваемые подходы, которые можно распространить на несколько столбцов.

11
Community 23 Май 2017 в 11:52

Вот общий способ сортировки массива объектов с несколькими столбцами:

var arr = [
    { id:5, name:"Name3" },
    { id:4, name:"Name1" },
    { id:6, name:"Name2" },
    { id:3, name:"Name2" }
],

// generic comparison function
cmp = function(x, y){
    return x > y ? 1 : x < y ? -1 : 0; 
};

//sort name ascending then id descending
arr.sort(function(a, b){
    //note the minus before -cmp, for descending order
    return cmp( 
        [cmp(a.name, b.name), -cmp(a.id, b.id)], 
        [cmp(b.name, a.name), -cmp(b.id, a.id)]
    );
});

Чтобы добавить другие столбцы для сортировки, вы можете добавить другие элементы в сравнение массивов.

arr.sort(function(a, b){
    return cmp( 
        [cmp(a.name, b.name), -cmp(a.id, b.id), cmp(a.other, b.other), ...], 
        [cmp(b.name, a.name), -cmp(b.id, a.id), cmp(b.other, a.other), ...]
    );
});

РЕДАКТИРОВАТЬ : согласно комментарию @PhilipZ ниже, сравнение массивов в JS преобразует их в строки, разделенные запятыми.

38
Mic 29 Авг 2013 в 20:11