Как заказать объект JSON двумя ключами?

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

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

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

Любая помощь будет большой.

Ответ 1

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

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. В нем представлены некоторые настраиваемые подходы, которые могут распространяться на несколько столбцов.

Ответ 2

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

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), ...]
    );
});

EDIT: за комментарий @PhilipZ ниже, сравнение массива в JS преобразует их в строки, разделенные comas.

Ответ 3

Если вы ищете более обобщенный подход, рассмотрите возможность использования функции, представленной в этом ответе.