我有一个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 :(得分: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);
答案 1 :(得分: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), {});
答案 2 :(得分: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]
}), {});