关键字为时间戳时的JavaScript对象顺序



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));

有什么解释吗?

传统上,对象中属性的顺序(想想映射(几乎永远不会得到保证;但自从ECMAScript 2015语言规范引入以来,属性顺序的可预测性就被引入了。但是…根据JSON规范,密钥的顺序仍然不能得到保证。

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

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"}

最新更新