【问题标题】:How to sort object with numeric keys in descending order?如何使用数字键按降序对对象进行排序?
【发布时间】:2019-11-25 18:13:54
【问题描述】:

我遇到了一个问题,我编写的代码似乎做了两件非常奇怪的事情。当逐行运行时,对象是在正确战争中的对象中构造的,但是一旦它退出 for 循环,创建的对象似乎默认回到按升序排列的键?

我发送到函数中的对象如下:

{
   0: 'Hello',
   20: 'World',
   40: 'Test'
}
const reverseObject = (object) => {
  const newObject = {};
  Object.keys(object).reverse().forEach((key) => {
    newObject[key] = object[key];
  });
  return newObject;
};

我期望在这里发生的是一个看起来像这样的对象:

{
   40: 'Test'
   20: 'World',
   0: 'Hello',
}

newObject 在循环中看起来像这样

{
   40: 'Test'
   20: 'World',
   0: 'Hello',
}

但在返回线上看起来像

{
   0: 'Hello',
   20: 'World',
   40: 'Test'
}

我不确定 javascript 中的某些内容是否限制了这种用例,但我尝试使用的 API 与它的设置采用具有如下键的对象的方式略有不同。

如果您能想出一种按预期排序的方法,我们将不胜感激。期待回复。

【问题讨论】:

  • 不保证对象中键的顺序
  • @DacreDenny 是对的。您可以做的一件事是在反转它们之前对键进行排序Object.keys(object).sort().reverse()。

标签: javascript arrays reactjs sorting object


【解决方案1】:

您可以通过将键设为字符串来解决对象键的自动排序问题。从技术上讲,@Dacre Denny 是正确的,不能保证 JavaScript 对象中键的顺序,但是 afaik 是否所有浏览器都保持创建对象时指定的键顺序,除了它们是数字!

const obj = {
   0: 'Hello',
   20: 'World',
   40: 'Test'
};

const objStrKeys = {
   '_0': 'Hello',
   '_20': 'World',
   '_40': 'Test'
};

const reverseObject = (object) => {
  const newObject = {};
  Object.keys(object).reverse().forEach((key) => {
    newObject[key] = object[key];
  });
  return newObject;
};

console.log('obj', reverseObject(obj));
console.log('objStrKeys', reverseObject(objStrKeys));

并不是说“仅”将键括在引号中并保留数字是不够的,它们需要某种字符串前缀/后缀。是的,我知道根据您的用例,这可能不起作用,而且它相当丑陋,但如果您真的需要相反顺序的属性,这是您的选择 =)...

【讨论】:

    【解决方案2】:

    我不相信键排序是确定性的。至少,Chrome 似乎总是按顺序排列它们:

    Object.keys({20: 'Hello', 30: 'There', 0: 'World'});
    >> ["0", "20", "30"]
    

    【讨论】:

    • 我猜这是一种恼人但合理的痛苦。可能必须打开一个问题以允许将数组传递到作者 github 上的库中。因为它目前只能以一种不太好的方式工作。但是感谢您清除那个
    • @ChrisMarshall 拥有一个具有排序顺序的未排序集是没有意义的。 Firefox 以前不保证键顺序,但被社区强制(错误地恕我直言)跟随其他浏览器使键具有创建顺序(除了始终按升序排列的数字键)。规范已更改为指定键顺序,但仔细阅读 ECMAScript actually 字样后并未指定键顺序。恕我直言,go 编程语言以正确的方式做到了 - 他们有一个随机数生成器用于密钥顺序,以阻止人们依赖实现细节
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    相关资源
    最近更新 更多