【问题标题】:Looping through an array and setting each element as a property of an object messes with the order循环遍历数组并将每个元素设置为对象的属性会导致顺序混乱
【发布时间】:2020-12-02 07:24:00
【问题描述】:

我有一个包含一些 ID 的数组:

let ids = [ '184', '085', '241', '086', '087', '165' ];

还有一个空对象 - let data = {};

我正在遍历数组并将每个元素设置为对象的属性:

ids.forEach(id => {
    data[id] = '';
});

我希望数据对象是:

{ '184': '', '085': '', '241': '', '086': '', '087': '', '165': '' }

但是当我console.log(data)我发现属性的顺序搞砸了data是:

{ '165': '', '184': '', '241': '', '085': '', '086': '', '087': '' }

我也试过用这种方法循环数组:

for (let id of ids) {
    data[id] = '';
}

但同样的混乱订单结果。我需要知道如何以正确的顺序设置属性,更重要的是,是什么导致了这个问题。

【问题讨论】:

  • 对象不是有序的数据结构——你可以通过 prop 名称而不是索引来访问它们的内容。如果顺序很重要,请保留数组。
  • 正如 jonrsharpe 所说 - 这是不可能的,因为对象键本身从未被排序。我可以问你为什么要按顺序排列它们吗?你需要按一定的顺序对它们做任何事情吗?
  • @DavidLosert 实际上,对象键确实有定义的顺序。见stackoverflow.com/questions/5525795/…
  • @jonrdharpe 我以为我在某处读过,现在对象属性确实有顺序。该顺序是基于插入的,即最旧的插入属性出现在最近的插入之前...

标签: javascript arrays loops object properties


【解决方案1】:

您需要改用Map 来维护插入顺序。对象键按插入顺序排列,但数字键按升序排列。

let ids = [ '184', '085', '241', '086', '087', '165' ];
const map = new Map;
ids.forEach(id => map.set(id, ''));
map.forEach((val,key)=>console.log(key,'=',val));

【讨论】:

  • 非常感谢@hev1 的回答。奇迹般有效!另外,我不知道地图,所以也谢谢你!
  • new Map; 不需要是new Map(); 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
相关资源
最近更新 更多