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

时间:2019-07-17 00:04:29

标签: javascript arrays reactjs sorting object

我遇到一个问题,即我编写的​​代码似乎做了两件非常奇怪的事情。当一行一行地运行对象时,对象是在正确的战争中构造的,但是一旦它脱离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与其设置采用的对象的顺序略有不同的API会稍有不同。

如果您能想到一种按预期进行排序的方法,将对您的帮助非常感谢。期待得到答复。

2 个答案:

答案 0 :(得分:1)

我不相信按键顺序是确定性的。至少,Chrome似乎总是按顺序对其进行排序:

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

答案 1 :(得分: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));

“仅仅”将键括在引号中并使其保持数字是不够的,它们需要某种字符串前缀/后缀。是的,我知道这可能无法使用,具体取决于您的用例,而且很难看,但是如果您确实需要反向的属性,则可以选择=)...