【问题标题】:JavaScript object order when key is timestamp键为时间戳时的 JavaScript 对象顺序
【发布时间】:2021-01-05 07:50:57
【问题描述】:

JavaScript 对对象属性的排序有一套规则。我有一个奇怪的例子。

当以毫秒为单位的时间戳用作对象属性键时,排序不起作用

当以为单位的时间戳用作对象属性键时,排序有效

var objS = {
    1600333200: 'a',
    1600419600: 'b',
    1600338600: 'c'
};
console.log('seconds', JSON.stringify(objS));


var objMs = {
    1600333200000: 'a',
    1600419600000: 'b',
    1600338600000: 'c'
};
console.log('milliseconds', JSON.stringify(objMs));

有什么解释吗?

【问题讨论】:

  • 我认为 ro 2^32(或 2^31?)上的数字键是有序的......但是......我必须看看这是否符合某些规范 - 我一直一直认为根本无法保证关键顺序 - 但规格会发生变化
  • AFAIK,JS 对象中键的顺序不能保证任何类型。我强烈建议您不要在任何逻辑上依赖它们。
  • 我刚刚读到,对于任何可以是不超过 2^53 的整数的键的顺序都应该是数字的......但显然这是错误的
  • @SaurabhTiwari - ES6 发生了变化 - 只是寻找它(这就是谷歌的目的)
  • 快速测试 ... 整数表示最多为 2^32 的数字,之后它们不被视为数字 - 所以成为“按创建顺序排列的字符串”

标签: javascript arrays json sorting object


【解决方案1】:

传统上,对象中属性的顺序(想想地图)几乎永远无法保证;但是自从引入ECMAScript 2015 Language Specification 之后,就引入了predictability of property order。但是……根据JSON spec,仍然不能保证order of keys

您可以编写自己的序列化函数来对键进行数字排序。

const serialize = obj =>
  `{${Object.keys(obj)
    .sort((a, b) => parseInt(a) - parseInt(b))
    .map(key => `"${key}":${JSON.stringify(obj[key])}`).join(',')}}`;

var objMs = {
  1600338600000: 'c',
  1600333200000: 'a',
  1600419600000: 'b',
};

console.log('milliseconds', serialize(objMs));

输出

milliseconds {"1600333200000":"a","1600338600000":"c","1600419600000":"b"}

【讨论】:

  • 当然,这是一个很好的解决方案。但我只是想了解什么是问题。
  • @poletn23 我添加了一些链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 2011-08-31
  • 2012-02-18
  • 2011-06-07
相关资源
最近更新 更多