如何只对JS中对象的值进行排序?

时间:2018-02-13 19:00:29

标签: javascript sorting

我有一个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中实现我想要的东西?

3 个答案:

答案 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)

有更多优雅的解决方案涉及第三方库(需要zippartition等),但这应该可以帮助您:

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]
  }), {});