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