当对象的键为数字时,Object.fromEntries()会改变数组中值的顺序 -- Javascript。

3
我有一个数组:
arr = [ ['1', 'a'], ['12', 'b'], ['2', 'c'] ];

我正在使用 Object.fromEntries() 将数组转换为带有键/值对的对象。 但问题是,Object.fromEntries() 似乎会根据键改变数组的顺序,例如:我希望将上面的数组转换为具有与代码中显示相同顺序的对象:
期望输出:
{1: 'a', 12: 'b', 2: 'c'}

fromEntries() 的实际输出

{1: 'a', 2: 'c', 12: 'b'}

有什么想法,为什么函数会这样做,是否有避免这种情况并呈现与数组提供的相同顺序的方法?


5
这两个对象在语义上是等价的。JavaScript 对象本身并没有属性的实际顺序;尽管在简单情况下该顺序通常被保留,但不能指望这一点。 - Aioros
3
如果您想让对象有序,可以尝试使用“Map”。 - mykaf
1
@Aioros,JavaScript 对象确实有顺序(至少在使用任何合理更新的浏览器时是如此)。只是类似数字的键首先出现,并按升序排列。 - Ivar
@Ivar 这只是与 Chrome 相关的吗? - EugenSunic
3
不是,这是语言规范的一部分。 - Ry-
@Ivar,为了跨引擎兼容性,确实指定了一种确定性枚举顺序,但这并不意味着对象是有序的。它们并不是设计用于作为有序集合 - 请使用数组来代替。 - Bergi
1个回答

2
JavaScript对象中属性的顺序不能保证是插入顺序。特别地,解析为整数的键(例如在您的情况下)将不遵守插入顺序。
如果您需要保证顺序,请尝试使用Map
let arr = [ ['1', 'a'], ['12', 'b'], ['2', 'c'] ];
const map = new Map();
for(let value of arr){
 map.set(value[0], value[1])
}

2
不仅仅是“一些浏览器”。根据规范,类似数字的键总是首先按数字顺序排序:https://tc39.es/ecma262/#sec-ordinaryownpropertykeys - Terry
@Lauren:谢谢你,但我的问题仍然存在 - 即使我使用Map,我也希望我的最终输出格式为对象,并且为此我们最终需要使用Object.fromEntires(),对吗?而且输出结果的顺序会再次改变。我的理解正确吗? - user1234
@Terry,你说得对,谢谢,我已经编辑了我的回答。 - Lauren Prete
1
@user1234 很遗憾,如果您希望最终结果按特定顺序排列,就不能使用具有类似数字的键的对象。如果您想使用具有类似数字的键的对象,则无法按特定顺序排列。 - Lauren Prete
1
如果Map不适合,另一个选择是使用数组,在其中存储特定索引处的值...例如 arr[1] = a,arr[2] = c ... arr[12] = b。@user1234 - Lauren Prete

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接