javascript - Javascript附加对象不保证顺序
问题描述
我在关于保证顺序的对象的堆栈溢出中查看了这个问题。 JavaScript 是否保证对象属性顺序?
有的说保证,有的说不保证,视情况而定。同时我遇到了以下问题。
我有一个对象数组,类似于下面:
const arrayObject = [
{id:'a123', bar:'hello'},
{id:'a321', bar: 'foo'} ];
现在我想把这个arrayObject变成object的对象,结构如下,与数组的顺序相同:
const object = {
'a123': {id:'a123', bar:'hello'},
'a321': {id:'a321', bar: 'foo'},
}
基本上使用数组中每个项目的 id 作为对象的键。下面是我用来尝试实现它的代码:
let newObj = {};
arrayObject.forEach(data=>{
const temp = {
[data.id]:{
id: data.id,
bar: data.bar
},
};
newObj={...newObj, ...temp};
})
我确实得到了正确的结构,但是顺序与 arrayObject 的顺序不同,即它返回:
const object = {
'a321': {id:'a321', bar: 'foo'},
'a123': {id:'a123', bar:'hello'},
}
我尝试了数组中的更多项目,得到了相同的结果。它不保证订单。
我的代码有问题,还是根本不能保证订单?
我该怎么做才能使对象与数组的顺序相同?
解决方案
通过在(无序的)对象中包含订购信息来保留顺序。以后任何时候,当您需要恢复原始订单时,请使用保存的订单信息...
const arrayObject = [{
id: 'a123',
bar: 'hello'
},
{
id: 'a321',
bar: 'foo'
}
];
let object = {}
arrayObject.forEach((e, i) => {
object[e.id] = { ...e, orderWith: i } // the index will tell us how to sort later
})
// later on
let sorted = Object.values(object).sort((a, b) => a.orderWith - b.orderWith)
console.log(sorted)
推荐阅读
- sql-server - 尝试在 linux mssql server 2019 中运行 polybase 查询时,是什么导致“尚未连接远程 Java 桥”?
- java - linux命令行上jmeter非法反射访问操作报错
- asp.net - 路由 url 包括 ?=
- python-3.x - 将对象作为函数的参数传递给作业调度程序
- python - 用于 Bitbucket 超时问题的 Python 和 Stashy
- node.js - Nodejs 使用 FormData 将文件上传到 Strapi
- zapier - 在 Zapier 中以友好方式显示错误时出现问题
- java - 矩形面积计算
- google-analytics - 我们如何在没有 __utmz cookie 的情况下获取流量源数据?
- python - Selenium Python中的窗口切换错误