如何按顺序遍历 ES6 Map?

How do I iterate through an ES6 Map in order?

ES6 映射的默认迭代顺序是插入顺序。您如何按 numeric/lexicographic 顺序遍历它?

不幸的是,Javascript 中没有像更好的语言(例如 C++ 的 std::map 或 Rust 的 BTreeMap)那样的有序映射。有像 btree-typescript 这样的第三方(基准测试部分列出了一些其他实现)。

所以您可以使用存储排序的地图。如果您使用的是 ES6 Map,您要么必须按顺序插入值并且永远不要更改它们,要么必须将所有键收集到一个数组中,然后对它们进行排序。如果你只做一次它实际上比使用 BTreeMap 更快(无论如何在 Rust 中,我假设在 Javascript 中也是如此)。但通常使用 B 树映射可能更好。

function sortedNumberKeys<V>(map: Map<number, V>): number[] {
  return [...map.keys()].sort((a, b) => a - b);
}

function sortedStringKeys<V>(map: Map<string, V>): string[] {
  return [...map.keys()].sort();
}

const m: Map<string, number> = new Map();

for (const key of sortedStringKeys(m)) {
  const val = m.get(key);
}