Как отсортировать только значения объекта в JS?

1

У меня есть объект JS, определенный как этот {0: 3, 2: 2, 4: 1}, и я хочу сортировать только значения и оставлять ключи в такте. Я имею в виду, что после сортировки объекта конечный результат должен быть {0: 1, 2: 2, 4: 3}, поэтому только значения меняют свои места, а не клавиши.

У меня есть следующий сегмент кода:

let list = {0: 3, 2: 2, 4: 1};
Object.keys(list)
      .sort((a, b) => list[a]-list[b])
      .reduce((obj, key) => ({
          ...obj, 
          [key]: list[key]
      }), {});

Но, похоже, это не работает. На самом деле, похоже, он вообще не сортирует его. Любые идеи о том, как добиться того, чего я хочу в JS?

  • 0
    См. Stackoverflow.com/questions/5525795/…
  • 0
    Используйте Set который гарантирует порядок ключей
Показать ещё 2 комментария
Теги:
sorting

3 ответа

2
Лучший ответ

Вы можете сортировать значения, ключи остаются в порядке возрастания, потому что по умолчанию ключи объектов, которые являются целыми числами, сортируются. Позже назначьте отсортированные значения клавишам.

var list = { 0: 3, 2: 2, 4: 1 },
    values = Object.values(list).sort((a, b) => a - b),
    result = Object.assign(...Object.keys(list).map((k, i) => ({ [k]: values[i] })));

console.log(result);
  • 0
    Спасибо, это, кажется, работает хорошо.
  • 0
    Это очень мило. Я написал свое собственное решение (с использованием Ramda) и собирался посмотреть, насколько легко оно будет перенесено на простой JS, когда я увидел это гораздо лучшее решение. отлично сработано!
0

Еще одно решение

let list = {
   0: 3,
   2: 2,
   4: 1
}

let values=Object.values(list).sort()

Object.keys(list)
  .sort()
  .reduce((obj, key, i) => ({
      ...obj,
        [key]: values[i]
  }), {});
0

Есть более элегантные решения с участием сторонних библиотек (требуется zip, partition и т.д.), Но это должно получить вас там:

let foo = {0: 3, 2: 2, 4: 1};

// here we'll just sort the keys and values independently and then
// recombine them
let keys = Object.keys(foo).sort((a, b) => a - b);
let vals = Object.values(foo).sort((a, b) => a - b);
let result = keys.reduce((acc, k, i) => (acc[k] = vals[i], acc), {});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню