Как отсортировать объектный литерал JS?

Если у меня есть этот литерал объекта JS:

var foo = {
    Sussy: 4,
    Billy: 5,
    Jimmy: 2,
    Sally: 1
};

Как я могу создать новый отсортированный литерал объекта:

var bar = {
    Sally: 1,
    Jimmy: 2,
    Sussy: 4,
    Billy: 5
};

2 ответа

Решение

Re: Как отсортировать объект JS?

Ответ: вы не можете. Таким образом, вместо этого вам нужна более сложная структура данных. У вас есть много вариантов:

  1. Вы можете использовать отдельный массив для хранения порядка ключей объекта. (Это то, что демонстрирует ответ @Felix Kling.) Хорошо: быстрый поиск по порядку или имени. Плохо: нужна вторая структура данных, которая должна синхронизироваться с первой.
  2. Вместо Объекта, просто содержащего свойства и значения, свойства могут содержать Объекты, которые содержат значения и порядок сортировки. Хорошо: 1 структура данных. Быстрый поиск по имени свойства. Плохо: медленный поиск по порядку (нужно сканировать структуру). Медленная сортировка.
  3. Используйте массив с элементами, состоящими из объектов, которые содержат ключ и значение. Хорошо: 1 структура данных. Быстрый поиск по заказу. Быстрая сортировка. Плохо: медленный поиск по имени свойства (необходимо просканировать структуру).

Я рекомендую решение 3, так как оно использует механику JS для управления заказами.

Примеры:

// Object holds sort order:  (Solution 2)
var foo = {
  Suzy: {v: 4, order: 0},
  Billy: {v: 5, order: 1},
  Jimmy: {v: 2, order: 2},
  Sally: {v: 1, order: 3}
};    

// Array holds keys: (Solution 3)
var woof = [
  {k: 'Suzy', v: 4},
  {k: 'Billy', v: 5},
  {k: 'Jimmy', v: 2},
  {k: 'Sally', v: 1}
];

// Sort the woof array by the key names:
woof.sort(function(a, b) {
  return a.k.localeCompare(b.k);
});

// The third key and value:
woof[2].k; // the third key
woof[2].v; // the third value

Отредактировано: обновлен код для исправления опечатки. Спасибо, Мартин Фидо

Свойства объекта не имеют определенного порядка (порядок зависит от реализации), и вы не можете сортировать свойства.

Вы должны сохранить массив ключей и соответственно отсортировать их, например:

var keys = [];

for(var key in obj) {
    if(obj.hasOwnProperty(key)) {
        keys.push(key);
    }
}

keys.sort(function(a, b) {
    return obj[a] - obj[b];
});

Теперь вы можете перебирать значения массива и использовать их для доступа к соответствующему свойству объекта.

Оказывается, с ES2015 порядок свойств объекта предсказуем. Что потрясающе.

Посмотрите здесь.

Другие вопросы по тегам