我遇到一个问题,我编写的代码似乎做了两件非常奇怪的事情。当逐行运行时,对象是在正确的战争中的对象中构造的,但是一旦脱离 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 与它的设置获取带有类似于订单键的对象的方式略有不同。
我怎样才能按预期对其进行排序?
我不相信按键顺序是确定性的。至少 Chrome 似乎总是按顺序排列它们:
Object.keys({20: 'Hello', 30: 'There', 0: 'World'});
>> ["0", "20", "30"]
您可以通过创建键字符串来解决对象键的自动排序问题。从技术上讲,@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));
并不是说“仅仅”将键用引号括起来并保留数字是不够的,它们需要某种字符串前缀/后缀。是的,我知道这可能不起作用,具体取决于您的用例,而且它相当难看,但如果您确实需要相反顺序的属性,这是您的选择 =)...