Как я могу отсортировать массив объектов javascript в численном порядке, а затем в алфавитном порядке?
Возможный дубликат:
Сортировка объектов в массиве по значению поля в JavaScript
Как я могу отсортировать массив объектов численно (по id), затем в алфавитном порядке (по имени)?
В текущем способе указан недопустимый вывод.
Это объект, который я пытаюсь сортировать по
var items = [
{
"id": 165,
"name": "a"
},
{
"id": 236,
"name": "c"
},
{
"id": 376,
"name": "b"
},
{
"id": 253,
"name": "f"
},
{
"id": 235,
"name": "e"
},
{
"id": 24,
"name": "d"
},
{
"id": 26,
"name": "d"
}
]
и способ, которым я пытаюсь сортировать
items.sort(function(a, b) {
return (a.id - b.id);
}).sort(function(a, b) {
return (a.name - b.name);
});
вот jsfiddle.
http://jsfiddle.net/jh4xb/
EDIT: Извините за путаницу, я был так смущен этой проблемой на некоторое время.
То, что я пытаюсь выполнить, - сначала отсортировать по наивысшему идентификатору, а затем отсортировать по алфавиту, чтобы в конце он выглядел так:
var items = [
{
"id": 376,
"name": "b"
},
{
"id": 253,
"name": "f"
},
{
"id": 236,
"name": "c"
},
{
"id": 235,
"name": "e"
},
{
"id": 165,
"name": "a"
},
{
"id": 26,
"name": "d"
},
{
"id": 24,
"name": "d"
}
]
Ответы
Ответ 1
Я думаю, это лучше сделать только с...
items.sort(function(a, b) {
return a.id - b.id || a.name.localeCompare(b.name);
});
Второй сорт будет в основном отрицать первый, поэтому вы должны сделать это один раз. )
a.id - b.id || a.name.localeCompare(b.name)
выражение сначала сравнивает id
s; только если они равны, они будут сравнивать имена (и возвращать результат этого сравнения).
Если вам нужно отменить порядок, поменяйте местами (b.id - a.id
и т.д.) - или просто отрицайте все:
items.sort(function(a, b) {
return - ( a.id - b.id || a.name.localeCompare(b.name) );
});
Здесь JSFiddle (нужно немного упростить данные, чтобы показать свою точку зрения).
Ответ 2
ЕСЛИ вы имеете в виду, что вы хотели, чтобы они отсортировались по id
, и если соответствует id
, вы хотите, чтобы они отсортировались по name
, тогда используйте это:
items.sort(function(a, b) {
if (a.id !== b.id) {
return a.id - b.id
}
if (a.name === b.name) {
return 0;
}
return a.name > b.name ? 1 : -1;
});
В противном случае ваш вопрос неясно.
Ответ 3
Создайте общую функцию для ее сортировки в любом случае. Проверьте функцию dynamicSort ниже
var items = [
{
"id": 165,
"name": "a"},
{
"id": 236,
"name": "b"},
{
"id": 376,
"name": "c"},
{
"id": 253,
"name": "d"},
{
"id": 235,
"name": "e"},
{
"id": 24,
"name": "f"}
];
function dynamicSort(property) {
return function(a, b) {
return (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
}
}
items.sort(dynamicSort('name')).sort(dynamicSort('id'));
console.log(items);
items.sort(dynamicSort('id')).sort(dynamicSort('name'));
console.log(items);
Ответ 4
Я не вижу ошибок в Chrome, но не правильно сортирую.
Если я изменю свой код сортировки на это:
var firstRun = items.sort(function(a, b) {
return (a.id - b.id);
});
var secondRun = firstRun.sort(function(a, b) {
return (a.name - b.name);
});
console.log(secondRun);
Я считаю, что он правильно сортируется. Ваш пример не обязательно должен делать второй сортировку, так как каждый номер (id) отличается. Но когда я делаю b, d и e все имеют идентификатор 235, он отлично сортируется.
Ответ 5
Ваша проблема в том, как вы сортируете буквы.
a.name - b.name
не делает то, что вы думаете. Он не оценивает их в лексиграфическом порядке.
замените его на
a.name < b.name ? -1 : 1;