如何用数字键对对象进行降序排序?

问题描述 投票:0回答:2

我遇到一个问题,我编写的代码似乎做了两件非常奇怪的事情。当逐行运行时,对象是在正确的战争中的对象中构造的,但是一旦脱离 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 与它的设置获取带有类似于订单键的对象的方式略有不同。

我怎样才能按预期对其进行排序?

javascript arrays reactjs sorting object
2个回答
1
投票

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

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

0
投票

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

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));

并不是说“仅仅”将键用引号括起来并保留数字是不够的,它们需要某种字符串前缀/后缀。是的,我知道这可能不起作用,具体取决于您的用例,而且它相当难看,但如果您确实需要相反顺序的属性,这是您的选择 =)...

© www.soinside.com 2019 - 2024. All rights reserved.