我最近在我的代码中遇到了一个错误,这是由于我在 MDN 上查看 Map 对象详细信息时遗漏了“ in insertion order ”文本。简而言之,我有一个地图对象,可以说
let myMap = new Map;
然后,在填充它之后,我用一个简单的 for .. of 语句遍历它的内容。像这样
for (let [key, val] of myMap) {
...
}
for 循环中的代码取决于要按 key 排序的 (key, value) 对。然而,填充地图的算法以随机顺序执行(我无法更改)。为了解决这个问题,我现在首先将所有可能的键添加到地图对象中,如下所示:
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;
//...
}
幸运的是,它们并不多(因此性能损失可以忽略不计),这很有效。这个解决方案对我来说仍然有点尴尬。
有更好的东西吗?
原文由 Pavel Beliy 发布,翻译遵循 CC BY-SA 4.0 许可协议
映射中键的顺序取决于映射实现。具有自然排序键的映射通常称为 _树映射_,因为键存储在 树 中。我没有在 JS 中使用树图,所以我不能推荐特定的实现。