Подтвердить что ты не робот

Как я могу отсортировать массив объектов 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"
    }
]
4b9b3361

Ответ 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;