首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过值对对象中的值进行排序- js

通过值对对象中的值进行排序- js
EN

Stack Overflow用户
提问于 2018-10-24 10:11:32
回答 3查看 52关注 0票数 0

为了更好地理解如何操作对象,我尝试根据对象的值对其进行排序。

例如:

代码语言:javascript
复制
let obj = {
    1: 5,
    2: 4,
    3: 200,
    4: 3,
    5: 1
}

我想要一个输出

代码语言:javascript
复制
{
    3: 200,
    1: 5,
    2: 4,
    4: 3,
    5: 1
}

我遍历了对象,并将其键值对添加到一个新数组中,然后按值进行排序。

新数组如下所示

代码语言:javascript
复制
[
    [3, 200],
    [1, 5],
    [2, 4],
    [4, 3],
    [5, 1]
]

然后我循环遍历这个数组,并从它创建一个新对象,但它的结果是

代码语言:javascript
复制
{ 1: 5, 2: 4, 3: 200, 4: 3, 5: 1 }

为什么?

代码语言:javascript
复制
let obj = {
  1: 5,
  2: 4,
  3: 200,
  4: 3,
  5: 1
}

const sortObj = o => {
  const arr = [];
  const _obj = {};

  for (const v in o) arr.push([v, o[v]]);

  arr.sort((a, b) => b[1] - a[1]);

  for (const v of arr) {
    console.log(v);
    /*
    [
      [3, 200],
      [1, 5],
      [2, 4],
      [4, 3],
      [5, 1]
    ]
    */
    const [key, val] = v;
    console.log(key, val);
    _obj[key] = val;
  }

  return _obj;
}

console.log(sortObj(obj));

EN

回答 3

Stack Overflow用户

发布于 2018-10-24 10:19:31

从ES2015开始,对象键几乎始终保持其插入顺序。然而,少数值得注意的例外之一是当你的键是整数的时候。

下面的例子显示,当我们使用string键时,排序工作得很好……

代码语言:javascript
复制
let obj = {
  test: 5,
  this: 4,
  out: 200,
  and: 3,
  see: 1
}

const sortObj = o => {
  const arr = [];
  const _obj = {};

  for (const v in o) arr.push([v, o[v]]);

  arr.sort((a, b) => b[1] - a[1]);

  for (const v of arr) {
    const [key, val] = v;
    _obj[key] = val;
  }

  return _obj;
}

console.log(sortObj(obj));

或者,使用始终保留顺序的Map

代码语言:javascript
复制
let obj = {
  1: 5,
  2: 4,
  3: 200,
  4: 3,
  5: 1
}

const sortObj = o => {
  const arr = [];
  const _obj = new Map();

  for (const v in o) arr.push([v, o[v]]);

  arr.sort((a, b) => b[1] - a[1]);

  for (const v of arr) {
    const [key, val] = v;
    _obj.set(key, val);
  }

  return _obj;
}

var sortedMap = sortObj(obj);
sortedMap.forEach((val, key) => console.log(`${key}: ${val}`));

票数 1
EN

Stack Overflow用户

发布于 2018-10-24 10:29:18

好吧,上面已经有了一个有效的答案,但我会把它贴出来,因为我已经开始尝试排序,并且有一个更短的版本。

相关阅读:Does JavaScript Guarantee Object Property Order?

代码语言:javascript
复制
let obj = {
    1: 5,
    2: 4,
    3: 200,
    4: 3,
    5: 1
}
sortedObj = Object.keys(obj).sort((key1, key2) => {
    if (obj[key1] > obj[key2]) {return -1;}
    if (obj[key1] < obj[key2]) {return 1;}
    return 0;
}).reduce((acc, key) => {
    acc['i_'+key] = obj[key];
    return acc;
}, {});
票数 1
EN

Stack Overflow用户

发布于 2018-10-24 11:30:38

如果可以使用Map,它将保持我在上面的评论中提到的顺序。使用Map的好处是,您的键不会被转换为字符串,它还保留了类型。

代码语言:javascript
复制
let obj = {
  1: 5,
  2: 4,
  3: 200,
  4: 3,
  5: 1
}

const sortObj = o => {
  const arr = [];
  const map = new Map();

  for (const v in o) arr.push([v, o[v]]);

  arr.sort((a, b) => b[1] - a[1]);

  for (const v of arr) {
    console.log(v);
    /*
    [
      [3, 200],
      [1, 5],
      [2, 4],
      [4, 3],
      [5, 1]
    ]
    */
    const [key, val] = v;
    //console.log(key, val);
    map.set(key,val);
  }

  return map;
}
sortObj(obj).forEach((k,v)=>console.log(v,k))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52960165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档