javascript - 对象键顺序
问题描述
将对象插入另一个对象时,我不明白这种安排。在这个例子中:
const list = {
"mainVal": {
}
}
list['mainVal']['010'] = {"a" : "1"}
list['mainVal']['020'] = {"a" : "1"}
list['mainVal']['021'] = {"a" : "1"}
list['mainVal']['023'] = {"a" : "1"}
list['mainVal']['031'] = {"a" : "1"}
list['mainVal']['032'] = {"a" : "1"}
list['mainVal']['300'] = {"a" : "1"}
结果:
{
"mainVal": {
"300": {
"a": "1"
},
"010": {
"a": "1"
},
"020": {
"a": "1"
},
"021": {
"a": "1"
},
"023": {
"a": "1"
},
"031": {
"a": "1"
},
"032": {
"a": "1"
}
}
}
最后一次“插入”时,为什么现在300
钥匙在对象的顶部?所以它不是按时间顺序,也不是按字母顺序。
我检查了相关问题:
但他们都谈到了财产的安排。我特别询问按键的排列。他们说它是按时间顺序或按字母顺序排列的,但这里不是这种情况。
如何使其按字母顺序排列(或者如果不可能,那么我可以强制它按时间顺序排列吗?):
{
"mainVal": {
"010": {
"a": "1"
},
"020": {
"a": "1"
},
"021": {
"a": "1"
},
"023": {
"a": "1"
},
"031": {
"a": "1"
},
"032": {
"a": "1"
},
"300": {
"a": "1"
}
}
}
任何人都可以阐明一下吗?谢谢
解决方案
那是因为整数索引出现在字符串索引之前,然后字符串索引出现在符号之前。
300
是一个整数索引,而010
是一个字符串索引。
这是我找到的一个很好的介绍。
我想要订购它们,您必须使用数组(按您想要的方式对它们进行排序),或者将其保存在一种类型的索引中。因此,例如,您可以通过在将每个键插入对象之前为每个键加上下划线来转换为字符串。
例子:
const x = {
"010": {
"a": "1"
},
"020": {
"a": "1"
},
"021": {
"a": "1"
},
"023": {
"a": "1"
},
"031": {
"a": "1"
},
"032": {
"a": "1"
},
"300": {
"a": "1"
}
}
let sorted = Object.keys(x)
.sort((a, b) => parseInt(a) - parseInt(b))
.map((key) => ({__key: key, ...x[key]}));
回报:
[ { __key: '010', a: '1' },
{ __key: '020', a: '1' },
{ __key: '021', a: '1' },
{ __key: '023', a: '1' },
{ __key: '031', a: '1' },
{ __key: '032', a: '1' },
{ __key: '300', a: '1' } ]
代理人
更好的是,您可以使用代理(IE11 不支持):
let y = new Proxy(x, {
ownKeys(target) {
return Object.keys(target)
.sort((a, b) => parseInt(a) - parseInt(b))
}
})
这Proxy
实际上将返回您想要的带有排序键的对象:
{ '010': { a: '1' },
'020': { a: '1' },
'021': { a: '1' },
'023': { a: '1' },
'031': { a: '1' },
'032': { a: '1' },
'300': { a: '1' } }
推荐阅读
- xamarin.forms - Azure DevOps App Center 任务错误:测试分块失败
- r - 如何让 switch() 处理 NA?
- php - 更新帖子内容中的链接
- angular - 为什么在Angular2中的触摸事件上没有调用自定义验证器?
- azure - 将 MS Teams 应用部署到 Azure 应用服务
- javascript - Electron 和 NodeJS:与实时流异步执行 shell 命令
- javascript - 如何以 html 形式上传多个文件而不一次选择所有文件?
- javascript - 将地图合并到地图 RxJS 打字稿中
- excel - 将 Excel 文件中的图像复制到 Word 表格中
- php - 如何将对象从 R 导出到 php 或 python