Как заказать объект 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
Если вы ищете более обобщенный подход, рассмотрите возможность использования функции, представленной в этом ответе.