Сортировать объект JavaScript по ключу или значению;ES6 - PullRequest
0 голосов
/ 24 марта 2019

Прежде чем я спросить; Существует множество дискуссий по этому конкретному вопросу, большинство из которых относятся к ES5 и не обязательно соответствуют истине ES6. Я пытаюсь получить некоторые разъяснения и, возможно, помочь следующему человеку, который ищет в Интернете ответ. Это относится к ES6 специально .

ВОПРОСЫ:

Рассмотрим следующую структуру объекта:

const unsorted_object = {
    'C': '0003',
    'D': '0004',
    'A': '0001',
    'B': '0002',
    'F': '0005',
}; 
  1. Как я могу отсортировать объект JavaScript по ключу? (Ответил здесь )

    const sorted_object = {};
    Object.keys(unsorted_object).sort().forEach(function(key) {
        sorted_object[key] = unsorted_object[key];
    });
    
  2. Как отсортировать объект JavaScript по значению ключа?

РЕДАКТИРОВАТЬ # 1

Возможно, я не совсем понял вопрос №2. Идея состоит в том, чтобы отсортировать объект JavaScript по значению ключа, а не по ключу и значению.

РЕДАКТИРОВАТЬ # 2

const unsorted_object = {
    '0001': '13.1666',
    '0002': '11.0001',
    '0003': '10.6664',
    '0004': '13.1666',
    '0005': '7.3331',
};

Выход:

'0001': '13.1666'
'0004': '13.1666'
'0002': '11.0001'
'0003': '10.6664'
'0005': '7.3331'

Ответы [ 3 ]

3 голосов
/ 24 марта 2019

Ключи объектов в ES6 имеют порядок обхода. Целочисленные ключи всегда стоят первыми и сортируются в порядке возрастания (0 -> 9). В нецелых ключах порядок присваивания сохраняется (см. article ). Для сортировки ключей объекта нам нужно воссоздать объект и добавить ключи в необходимом порядке.

Примечание: Это означает, что сортировка будет работать только по нецелочисленным ключам, потому что они всегда 1-ые и всегда сортируются в порядке возрастания.

Чтобы отсортировать и воссоздать объект:

const unsorted_object = {
    '0001': '13.1666',
    '0002': '11.0001',
    '0003': '10.6664',
    '0004': '13.1666',
    '0005': '7.3331',
};

const sorted_object = Object.entries(unsorted_object)
  .sort(([,v1], [,v2]) => +v2 - +v1)
  .reduce((r, [k, v]) => ({ ...r, [k]: v }), {});

console.log(sorted_object);

Edge friendly версия, которая использует Object.assign() вместо распространения:

const unsorted_object = {
    '0001': '13.1666',
    '0002': '11.0001',
    '0003': '10.6664',
    '0004': '13.1666',
    '0005': '7.3331',
};

const sorted_object = Object.entries(unsorted_object)
  .sort(([,v1], [,v2]) => +v2 - +v1)
  .reduce((r, [k, v]) => Object.assign(r, { [k]: v }), {});

console.log(sorted_object);
2 голосов
/ 24 марта 2019

Вы можете отсортировать entries и использовать reduce() для создания нового объекта.

С учетом вышесказанного, вероятно, что-то не так в дизайне вашего приложения из-за необходимости даже выполнять такую ​​операцию

const unsorted_object = {
  'C': '0003',
  'D': '0004',
  'A': '0001',
  'B': '0002',
  'F': '0005',
};

const sorted = Object.entries(unsorted_object)
  .sort((a, b) => a[1] - b[1])
  .reduce((a, c) => (a[c[0]] = c[1], a), {})

console.log(sorted)
2 голосов
/ 24 марта 2019

Извлеките entries вместо keys, затем sort по разности каждого значения:

const unsorted_object = {
    'C': '0003',
    'D': '0004',
    'A': '0001',
    'B': '0002',
    'F': '0005',
};

const sorted_object = {};
Object.entries(unsorted_object)
  .sort((a, b) => a[1] - b[1])
  .forEach(([key, val]) => {
    sorted_object[key] = val;
  });
console.log(sorted_object);

Обратите внимание, что, вероятно, более целесообразно использовать reduce для создания объекта из массива:

const unsorted_object = {
    'C': '0003',
    'D': '0004',
    'A': '0001',
    'B': '0002',
    'F': '0005',
};

const sorted_object = Object.entries(unsorted_object)
  .sort((a, b) => a[1] - b[1])
  .reduce((a, [key, val]) => {
    a[key] = val;
    return a;
  }, {});
console.log(sorted_object);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...