首页 > 解决方案 > 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'},
}

我尝试了数组中的更多项目,得到了相同的结果。它不保证订单。

我的代码有问题,还是根本不能保证订单?

我该怎么做才能使对象与数组的顺序相同?

标签: javascriptarraysobject

解决方案


通过在(无序的)对象中包含订购信息来保留顺序。以后任何时候,当您需要恢复原始订单时,请使用保存的订单信息...

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)


推荐阅读