Как заказать объект JSON двумя ключами? - PullRequest
9 голосов
/ 12 июля 2010

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

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

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

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

Ответы [ 3 ]

38 голосов
/ 12 июля 2010

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

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

10 голосов
/ 12 июля 2010

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

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

0 голосов
/ 18 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...