Javascript 地图排序

Pav*_*liy 12 javascript es6-map

我最近在代码中遇到了一个错误,这是由于我在 MDN 上查看 Map 对象详细信息时缺少“按插入顺序”文本。简而言之,我有一个地图对象,可以说

let myMap = new Map;
Run Code Online (Sandbox Code Playgroud)

然后,在填充它之后,我用一个简单的for .. of语句迭代它的内容。像这样

for (let [key, val] of myMap) { 
    ...
}
Run Code Online (Sandbox Code Playgroud)

for循环中的代码依赖于 (key, value) 对按key排序。然而,填充地图的算法是以随机顺序执行的(我无法更改它)。为了解决这个问题,我现在首先将所有可能的键添加到地图对象中,如下所示:

let myMap = new Map;
for (let i=0; i<maxkey; ++i) myMap.set(key(i), undefined);

// And in the for loop
for (let [key, val] of myMap) {
    if (typeof val === "undefined") continue;
    //...
}
Run Code Online (Sandbox Code Playgroud)

幸运的是,它们的数量并不多(因此性能损失可以忽略不计),而且这是有效的。不过这个解决方案对我来说看起来有点尴尬。

还有更好的吗?

wsy*_*per 9

根据 mozilla javascript 参考here

Map 对象按照条目插入的顺序迭代条目、键和值。

所以你应该在将键插入映射之前对键进行排序,然后你可以按键顺序迭代映射。


Ber*_*rgi 3

\n

for循环中的代码依赖于(key, value)对来按键排序。

\n
\n

那么 aMap对你来说是错误的数据结构。它的目的是快速查找,而不是维护顺序。如果您需要有序(可排序)序列,请使用数组。或者,如果您同时需要查找和自定义顺序,则将两者结合使用。对于具有少量已知键的特定情况,预先填充映射就可以了,或者仅将它们用于迭代

\n
for (let key=0; key < maxkey; key++) {\n    if (myMap.has(key)) {\n        const val = myMap.get(key);\n        \xe2\x80\xa6 // use key and value\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

或者,如果键数比地图中存储的键数多得多,您也可以这样做

\n
for (const key of Array.from(myMap.keys()).sort((a, b) => a-b)) {\n    const val = myMap.get(key);\n    \xe2\x80\xa6 // use key and value\n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果您必须多次执行此操作,您可能还想实现自己的迭代器。

\n

  • 映射*确实*维护一个顺序,即插入顺序。你想说的是地图不会保持*排序*。数组的顺序与映射相同,除非您显式使用“sort”方法。 (5认同)