Javascript映射排序

Javascript映射排序,javascript,es6-map,Javascript,Es6 Map,我最近在代码中遇到了一个错误,这是因为我在查看MDN上的映射对象详细信息时丢失了“插入顺序”文本。简而言之,我有一个map对象 let myMap = new Map; 然后,在填充它之后,我用一个简单的for来迭代它的内容。。声明的内容。像这样 for (let [key, val] of myMap) { ... } for循环中的代码取决于要按键排序的(键、值)对。然而,填充地图的算法是以随机顺序进行的(我不能改变这一点)。为了解决这个问题,我现在首先向map对象添加所有可能

我最近在代码中遇到了一个错误,这是因为我在查看MDN上的映射对象详细信息时丢失了“插入顺序”文本。简而言之,我有一个map对象

let myMap = new Map;
然后,在填充它之后,我用一个简单的for来迭代它的内容。。声明的内容。像这样

for (let [key, val] of myMap) { 
    ...
}
for循环中的代码取决于要按键排序的(键、值)对。然而,填充地图的算法是以随机顺序进行的(我不能改变这一点)。为了解决这个问题,我现在首先向map对象添加所有可能的关键点,如下所示:

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;
    //...
}
让myMap=newmap;
for(设i=0;i
for循环中的代码取决于要按键排序的(键、值)对

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

for (let key=0; key < maxkey; key++) {
    if (myMap.has(key)) {
        const val = myMap.get(key);
        … // use key and value
    }
}
如果必须不止一次地执行此操作,您可能还需要实现自己的迭代器

for循环中的代码取决于要按键排序的(键、值)对

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

for (let key=0; key < maxkey; key++) {
    if (myMap.has(key)) {
        const val = myMap.get(key);
        … // use key and value
    }
}

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

映射中键的顺序取决于映射实现。具有自然顺序键的映射通常称为树映射,因为键存储在中。我没有在JS中使用树映射,因此无法推荐特定的实现。

映射中键的顺序取决于映射实现。具有自然顺序键的映射通常称为树映射,因为键存储在中。我没有在JS中使用树映射,因此我不能推荐特定的实现。

将其转换为数组并对其进行排序。
[…map].sort([k1],[k2])=>k1.localeCompare(k2))
类型为[{key:T,value:V}]的数组,然后arr.sort((a,b)=>compare(a.key,b.key))?我想是的,这是一个选项,将其转换为数组并对其进行排序。
[…map].sort([k1],[k2])=>k1.localeCompare(k2))
类型为[{key:T,value:V}的数组,然后arr.sort((a,b)=>compare(a.key,b.key))?我想是的,这是一个选项maps确实维护一个顺序,插入的顺序。你想说的是,映射不会保持排序。数组的顺序与映射相同,除非你显式地使用
sort
方法。@DavidCallanan是的,这就是我的意思-映射不能被重新排序。即使它们对c使用固定的顺序在一致性上,排序并不是它们的主要目的。映射确实保持着一种顺序,即插入的顺序。您想说的是,映射不会保持排序。数组的顺序与映射相同,除非您明确使用
排序
方法。@DavidCallanan是的,这就是我的意思-映射不能被重新排序。即使它们这样做了,我们也不能重新排序e为了保持一致性,需要固定的顺序,而不是其主要目的。