Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
键为时间戳时的JavaScript对象顺序_Javascript_Arrays_Json_Sorting_Object - Fatal编程技术网

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

键为时间戳时的JavaScript对象顺序,javascript,arrays,json,sorting,object,Javascript,Arrays,Json,Sorting,Object,JavaScript在处理对象属性的顺序时有一套规则。我有一个奇怪的例子 当以毫秒为单位的时间戳用作对象属性键时,排序不起作用 当秒中的时间戳用作对象属性键时,排序有效 var objS={ 160033200:‘a’, 160041960:‘b’, 1600338600:‘c’ }; log('seconds',JSON.stringify(objS)); var objMs={ 1600332000:‘a’, 160041960000:‘b’, 160033860000:‘c’ }; lo

JavaScript在处理对象属性的顺序时有一套规则。我有一个奇怪的例子

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

秒中的时间戳用作对象属性键时,排序有效

var objS={
160033200:‘a’,
160041960:‘b’,
1600338600:‘c’
};
log('seconds',JSON.stringify(objS));
var objMs={
1600332000:‘a’,
160041960000:‘b’,
160033860000:‘c’
};

log('ms',JSON.stringify(objMs))传统上,对象中属性的顺序(想想地图)几乎永远无法保证;但是自从引入以来,就引入了。但是…根据合同,仍然不能保证安全

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

const serialize=obj=>
`{${Object.keys(obj)
.sort((a,b)=>parseInt(a)-parseInt(b))
.map(key=>`${key}):${JSON.stringify(obj[key])}`).join(',')}`;
var objMs={
160033860000:‘c’,
1600332000:‘a’,
160041960000:‘b’,
};

log('毫秒',序列化(objMs))传统上,对象中属性的顺序(想想地图)几乎永远无法保证;但是自从引入以来,就引入了。但是…根据合同,仍然不能保证安全

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

const serialize=obj=>
`{${Object.keys(obj)
.sort((a,b)=>parseInt(a)-parseInt(b))
.map(key=>`${key}):${JSON.stringify(obj[key])}`).join(',')}`;
var objMs={
160033860000:‘c’,
1600332000:‘a’,
160041960000:‘b’,
};

log('毫秒',序列化(objMs))我认为数字键RO2^32(或2^31?)是按顺序出现的。。。但是我必须看看这是否在某些规范中——我一直认为密钥顺序根本不能保证——但是规范changeAFAIK,JS对象中的密钥顺序对于任何类型都不能保证。我强烈建议你不要在任何逻辑上依赖它们。我刚刚读到,对于任何键,顺序应该是数字,可以是一个整数,最大为2^53。。。但显然是这样wrong@SaurabhTiwari-ES6有了一个变化-只是找到它(这就是谷歌的目的)一个快速测试。。。整数是指小于等于
2^32的数字,之后它们就不被认为是数字了-所以变成“按创建顺序排列的字符串”我认为大于等于2^32(或2^31?)的数字键是按顺序排列的。。。但是我必须看看这是否在某些规范中——我一直认为密钥顺序根本不能保证——但是规范changeAFAIK,JS对象中的密钥顺序对于任何类型都不能保证。我强烈建议你不要在任何逻辑上依赖它们。我刚刚读到,对于任何键,顺序应该是数字,可以是一个整数,最大为2^53。。。但显然是这样wrong@SaurabhTiwari-ES6有了一个变化-只是找到它(这就是谷歌的目的)一个快速测试。。。整数是指最多为
2^32的数字,在此之后它们不被视为数字-因此变成“创建顺序中的字符串”当然,这是一个好的解决方案。但我只是想了解问题所在。@poletn23我添加了一些链接。当然,这是一个很好的解决方案。但我只是想了解问题所在。@poletn23我添加了一些链接。