Js对象 调整属性排序是否有意义

年会终于结束了,忙了一个月,终于可以开始填坑了。

昨天把之前写了一半的 滚动侦测导航 给写完了。

写的途中就有在思考 对象属性的排序问题,

最开始我是直接用数组的下标作为年份,输出的时候会出现一堆空白 item,

然后改成赋值给一个 timeline 对象,以年为属性名,月份为内部数组元素

但是循环输出内容的时候就发现会按照正序的方式去输出属性。
比如我整理好的数据为

1
2
3
4
5
const timeline = {
"2020": ["01"],
"2019": ["12", "11", "10", "09", "08", "07", "06", "05", "04", "03", "02", "01"],
"2018": ["12", "11", "10", "09"]
};

那么我使用 Vue 的 v-for 循环输出的时候,其实是从 2018 开始的,配合 flex 布局是达到了效果,但是使用 Js 去滚动的时候出现了问题。
自己也思考了很久,最后还是用数组的方式去实现了。

1
2
3
4
5
const timeline = [
{ year: "2020", months: ["01"] },
{ year: "2019", months: ["12", "11", "10", "09", "08", "07", "06", "05", "04", "03", "02", "01"]},
{ year: "2020", months: ["12", "11", "10", "09"] }
];

方式二

1
2
3
4
5
const timeline = [
["2020", ["01"]],
["2019", ["12", "11", "10", "09", "08", "07", "06", "05", "04", "03", "02", "01"]],
["2020", ["12", "11", "10", "09"]]
];

这种方式也行,而且代码更简洁,判断是否是新的一年时也方便很多。
但是我觉得写 demo 这样可能不够明了还是用了数组包对象的方式来做。

然后昨天夜里刚填完坑,今天上午就有人在群里问对象的属性排序的问题。

聊天截图

正巧别人也有这个疑问,我就接着琢磨了。

然后在 segmentfault 上找到了一样的问题 Js 中如何调换对象属性的位置

里边直接就有人提到了 意义何在

详细的回答

dablwow80:
object 是无序的,看起来像添加顺序也不是稳定的,所以你改变 key 的“顺序”,以及利用这个“顺序”执行一些逻辑,都是不稳定的

具体原因我在大佬群里问了一下。

object 作为 javascript 的一种数据存储格式,采用哈希表的存取方式,而 hashmap 是不保证属性顺序的

基本可以理解为 object 数据存储是没有顺序的

所以,在对有数据顺序有要求的场景下,应该避免使用 object 来存取数据,尽量用 array 来替代