Javascript地图订购

时间:2018-04-27 19:19:52

标签: javascript es6-map

我最近在我的代码中遇到了一个错误,原因是我错过了#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;
    //...
}

幸运的是,其中很多都没有(因此性能损失可以忽略不计),而且这很有效。这个解决方案对我来说仍然有点尴尬。

还有更好的东西吗?

2 个答案:

答案 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中使用树形图,所以我不推荐特定的实现。