У меня есть объект 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?
Вы можете сортировать значения, ключи остаются в порядке возрастания, потому что по умолчанию ключи объектов, которые являются целыми числами, сортируются. Позже назначьте отсортированные значения клавишам.
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);
Еще одно решение
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]
}), {});
Есть более элегантные решения с участием сторонних библиотек (требуется 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), {});
Set
который гарантирует порядок ключей