我遇到一个问题,即我编写的代码似乎做了两件非常奇怪的事情。当一行一行地运行对象时,对象是在正确的战争中构造的,但是一旦它脱离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会稍有不同。
如果您能想到一种按预期进行排序的方法,将对您的帮助非常感谢。期待得到答复。
答案 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));
“仅仅”将键括在引号中并使其保持数字是不够的,它们需要某种字符串前缀/后缀。是的,我知道这可能无法使用,具体取决于您的用例,而且很难看,但是如果您确实需要反向的属性,则可以选择=)...