You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Object.values()处理对象后,返回数组的元素顺序是否会改变?

Object.values() 返回数组的元素顺序为何与对象定义顺序不一致?

这是个很常见的困惑,答案是:是的,Object.values() 返回的数组顺序确实可能和对象字面量里的属性定义顺序不一样,核心原因是 JavaScript 对象的属性遍历规则在 ES6 之后有明确规定,但数字类型的键(包括字符串形式的数字键,比如你的时间戳字符串)会被特殊处理。

具体规则说明

ES6 及后续标准中,Object.values()、Object.keys()、Object.entries() 这些方法的遍历顺序遵循以下优先级:

  • 第一优先级:所有可枚举的数字类型键(包括能被转换为数字的字符串键,比如你的"1483295400000")会被转换成数值,然后按从小到大的升序排列,完全忽略它们在对象中的定义顺序。
  • 第二优先级:非数字的字符串键,按它们被添加到对象的顺序排列。
  • 第三优先级:Symbol 类型的键,同样按添加顺序排列。

结合你的例子分析

你的对象里所有键都是时间戳字符串,本质上可以被解析为数字,所以会被归为第一优先级的数字键。我们把这些键转换成数值后排序:

// 你的对象键转换为数值后:
1483295400000, 1483900200000, 1484505000000, 1485109800000, 1485714600000

按升序排列后,对应的顺序应该是:

  1. 1483295400000 → Jan 02 to 08
  2. 1483900200000 → Jan 09 to 15
  3. 1484505000000 → Jan 16 to 22
  4. 1485109800000 → Jan 23 to 29
  5. 1485714600000 → Jan 30 to 05

你提到返回的首元素是 Jan 23 to 29 的项,可能是你在定义对象时键的实际顺序和描述不一致,或者误看了结果,但核心逻辑是数字键会被自动按数值排序,而非定义顺序。

解决方案:如何保留定义顺序?

如果需要严格保留对象字面量里的属性定义顺序,有三种常用办法:

  • 改用非数字键:比如给时间戳字符串添加前缀,比如"ts_1483295400000",这样它们会被当作普通字符串键,按定义顺序遍历。
  • 使用 Map 代替普通对象:Map 会严格保留键的插入顺序,你可以这样创建和取值:
    const myMap = new Map([
      ['1483295400000', {label: "Jan 02 to 08", total: 8062, billings: Array(4)}],
      ['1483900200000', {label: "Jan 09 to 15", total: 9940, billings: Array(8)}],
      // ... 其他项
    ]);
    // 获取值数组,顺序和插入一致
    const valuesArray = Array.from(myMap.values());
    
  • 手动指定键顺序:如果必须使用当前的对象结构,可以先保存你想要的键顺序数组,再通过映射得到对应的值:
    const desiredOrder = ['1483295400000', '1483900200000', '1484505000000', '1485109800000', '1485714600000'];
    const orderedValues = desiredOrder.map(key => object[key]);
    

内容的提问来源于stack exchange,提问作者Tejaswi katha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:35:45