我最近在我的代码中遇到了一个错误,原因是我错过了#34; 的插入顺序"通过MDN上的Map对象详细信息查看文本。简而言之,我有一个地图对象,让我们说
let myMap = new Map;
然后,在填充之后,我用一个简单的 for 语句迭代它的内容。喜欢这个
for (let [key, val] of myMap) {
...
}
for 循环中的代码取决于要按键排序的(键,值)对。然而,填充地图的算法是以随机顺序进行的(并且我不能改变它)。为了解决这个问题,我现在首先将所有可能的键添加到地图对象中,如下所示:
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;
//...
}
幸运的是,其中很多都没有(因此性能损失可以忽略不计),而且这很有效。这个解决方案对我来说仍然有点尴尬。
还有更好的东西吗?
答案 0 :(得分:1)
for循环中的代码取决于要按键排序的(键,值)对。
然后Map
是错误的数据结构。它的目的是快速查找,而不是维护订单。如果需要有序序列,请使用数组。或者,如果您同时需要查找和订购,则将它们组合使用。对于具有少量已知键的特定情况,预先填充地图是正常的,或者仅将它们用于迭代
for (let key=0; key < maxkey; key++) {
if (myMap.has(key)) {
const val = myMap.get(key);
… // use key and value
}
}
或者如果地图中存储的密钥多于存储的密钥,您也可以
for (const key of Array.from(myMap.keys()).sort((a, b) => a-b)) {
const val = myMap.get(key);
… // use key and value
}
如果必须多次执行此操作,您可能还需要实现自己的迭代器。
答案 1 :(得分:1)
地图中键的排序取决于地图实现。具有自然排序键的地图通常称为树地图,因为密钥存储在tree中。我没有在JS中使用树形图,所以我不推荐特定的实现。