JS对象使用invert方法键值反转后顺序不符合预期是什么原因?
JS对象反转后属性顺序不符合预期的原因
ES6 规范之后,普通对象({} 创建的)的属性枚举顺序是固定的,但不是完全按照属性插入的先后顺序排列,而是遵循以下优先级:
- 首先是所有可以转换为非负整数的字符串类型键,按照数值从小到大排序
- 其次是普通字符串类型键,按照属性被创建的先后顺序排序
- 最后是 Symbol 类型键,按照创建的先后顺序排序
你反转后生成的对象有三个键:'Greg'、'40'、'cook',其中 '40' 属于可以转换为非负整数的字符串键,所以会被引擎自动优先排在所有普通字符串键的最前面,最终呈现你看到的输出顺序。这个表现是JS的标准行为,和你写的 invert 函数逻辑无关。
如果有严格保留属性插入顺序的需求,推荐使用ES6新增的Map结构,它的遍历顺序严格遵循属性插入的先后顺序,不会对键做自动排序调整,示例实现如下:
const obj = { keyname: 'Greg', keyage: 40, keyjob: 'cook'}; const invertedMap = new Map(Object.entries(obj).map(([key, value]) => [value, key])) // 遍历Map会严格按照 Greg → 40 → cook 的插入顺序输出 for (const [k, v] of invertedMap) { console.log(k, v) }
内容的提问来源于stack exchange,提问作者degsX2
相关产品推荐
相关产品推荐

