Javascript JS不对数字对象索引进行排序

Javascript JS不对数字对象索引进行排序,javascript,loops,object,Javascript,Loops,Object,当创建这样的对象时 let o={} o[“prop2”]=“val” o[“prop1”]=“val” 属性是按设置的顺序存储的,因此在获取对象的键(object.keys(o))时,它们会按正确的顺序返回([“prop2”,“prop1”])。这种顺序具有广泛的影响,因为for…in循环使用它,因此JSON.stringify也受到它的影响。我想使用这种行为来优化性能(比如发送更容易解析的已排序对象) 然而,当使用数字索引时,所有这些都会崩溃。看似相似的物体 let o = {} o[&q

当创建这样的对象时

let o={}
o[“prop2”]=“val”
o[“prop1”]=“val”
属性是按设置的顺序存储的,因此在获取对象的键(
object.keys(o)
)时,它们会按正确的顺序返回(
[“prop2”,“prop1”]
)。这种顺序具有广泛的影响,因为
for…in
循环使用它,因此
JSON.stringify
也受到它的影响。我想使用这种行为来优化性能(比如发送更容易解析的已排序对象)

然而,当使用数字索引时,所有这些都会崩溃。看似相似的物体

let o = {}
o["2"] = "val"
o["1"] = "val"
不确认上述行为。这里
Object.keys(o)
返回
[“1”,“2”]
:(

是否可以以某种方式避免这种情况?如果不预先/事后修复所有属性?

请改用a来保留插入顺序

设m=newmap;
m、 集合(“2”,“val”);
m、 设定(“1”、“val”);

m、 forEach((v,k)=>console.log(k,“=”,v));
这些都是由于ES规范。由于历史原因和优化技术(整数访问可以高度优化为本机级别的数组访问,而React等主要库则依赖于此)。您可以使用Map()或者给它们加前缀,使它们不是整数。尝试使用它们将保留的顺序insertion@theblackgigant如果我能
JSON,映射将非常有用。stringify
them不管怎样,您以后都必须对其进行反序列化,因此依赖顺序通常不是一个好主意。简短的回答是否定的,您应该避免依赖键order@MaximilianMairinger在性能方面,需要真实世界的数据集和上下文才能发挥作用。根据环境、数据集类型和大小以及用例等各种因素,它可能会有很大的不同。如果您担心JS引擎似乎在做您认为不应该做的额外工作,请知道该引擎最像对于处理这些事情,ly的优化程度远远超过了手动操作。内部数据的解析和表示的复杂性不会更高,而且很可能是线性的或相对于您自己的数据而言是恒定的。如果属性c也是一个映射,那么这将分解,对吗?@MaximilianMairinger您可以实现callback函数转换为处理它的JSON.stringify/parse functions@hev1我建议使用reviver/replacer功能,而不是手动递归遍历它。该实现看起来也非常非常低效。这里有一点意见,但如果介于这两者之间,只是前缀,或者为Map之类的东西使用您自己的自定义对象表示法,或者存储一组要预处理的键服务顺序,我会说也许只是在它前面加上前缀,然后结束,或者如果需要绝对性能,使用一系列键。根据您实际需要选择其中一个,其中每个键可能比others@MaximilianMairinger试试这个: