使用 JavaScript 对 Map 中的键进行排序
Sort the Keys in a Map using JavaScript
使用该sort()
方法对 Map 中的键进行排序,例如
const sorted = new Map([...map1].sort())
. 扩展语法 (…) 用于获取 Map 条目的数组,我们可以使用sort
方法对其进行排序。
索引.js
// ✅ When Keys are STRINGS const map1 = new Map([ ['z', 'three'], ['a', 'one'], ['b', 'two'], ]); // 👇️ {'z' => 'three', 'a' => 'one', 'b' => 'two'} console.log(map1); // ✅ Sort Ascending (low to high) const sortedAsc = new Map([...map1].sort()); // 👇️ {'a' => 'one', 'b' => 'two', 'z' => 'three'} console.log(sortedAsc); // ✅ Sort Descending (high to low) const sortedDesc = new Map([...map1].sort().reverse()); console.log(sortedDesc); // 👉️ {'z' => 'three', 'b' => 'two', 'a' => 'one'} // --------------------------------------------------------- // ✅ When keys are NUMBERS const map2 = new Map([ [3, 'three'], [1, 'one'], [2, 'two'], ]); // ✅ Sort Ascending (low to high) const sortNumAsc = new Map([...map2].sort((a, b) => a[0] - b[0])); // 👇️ {1 => 'one', 2 => 'two', 3 => 'three'} console.log(sortNumAsc); // ✅ Sort Descending (high to low) const sortedNumDesc = new Map([...map2].sort((a, b) => b[0] - a[0])); // 👇️ {3 => 'three', 2 => 'two', 1 => 'one'} console.log(sortedNumDesc);
Map对象会记住键的
插入顺序。
这就是为什么我们使用
Map()Map
构造函数以正确的顺序
创建一个新的。
扩展语法 (…)
允许我们获取包含 Map 条目的数组。
索引.js
const map1 = new Map([ ['z', 'three'], ['a', 'one'], ['b', 'two'], ]); // 👇️ [['z', 'three'], ['a', 'one'], ['b', 'two']] console.log([...map1]);
使用字符串键对 Map 进行排序时,我们只需调用
sort()
方法即可。
索引.js
const map1 = new Map([ ['z', 'three'], ['a', 'one'], ['b', 'two'], ]); // 👇️ [['a', 'one'], ['b', 'two'], ['z', 'three']] console.log([...map1].sort());
这为我们提供了一个包含键值对数组的数组,我们可以将其直接传递给
Map
构造函数以创建一个具有排序键的新数组。 Map
这是完整的代码片段:
索引.js
// ✅ When Keys are STRINGS const map1 = new Map([ ['z', 'three'], ['a', 'one'], ['b', 'two'], ]); // 👇️ {'z' => 'three', 'a' => 'one', 'b' => 'two'} console.log(map1); // ✅ Sort Ascending (low to high) const sortedAsc = new Map([...map1].sort());
当在键值对数组上调用该
sort()
方法时,我们只是简单地对键值对的字符串转换进行排序,例如z,three
vs a,one
。我们使用相同的方法按降序对 Map 的键进行排序。我们所要做的就是reverse()
在排序后添加对该方法的调用。
索引.js
// ✅ When Keys are STRINGS const map1 = new Map([ ['z', 'three'], ['a', 'one'], ['b', 'two'], ]); // ✅ Sort Descending (high to low) const sortedDesc = new Map([...map1].sort().reverse()); console.log(sortedDesc); // 👉️ {'z' => 'three', 'b' => 'two', 'a' => 'one'}
如果 Map 的键是数字,则必须将函数传递给该sort()
方法。
该方法采用的参数是定义排序顺序的函数。
该函数使用2
参数调用。在我们的示例中,有 2 个包含键值对的数组。
索引.js
const map2 = new Map([ [3, 'three'], [1, 'one'], [2, 'two'], ]); // ✅ Sort Ascending (low to high) const sortNumAsc = new Map([...map2].sort((a, b) => a[0] - b[0])); // 👇️ {1 => 'one', 2 => 'two', 3 => 'three'} console.log(sortNumAsc);
该sort()
方法使用以下逻辑对数组中的元素进行排序:
-
如果比较函数的返回值大于,则
先0
排序。b
a
-
如果比较函数的返回值小于,则
先0
排序。a
b
-
如果比较函数的返回值等于
0
,则保持原先的顺序a
和b
。
在上面的代码片段中:
- 如果数组中的第一个元素(键)
a
减去数组中的第一个元素
b
返回的值大于,我们之前0
排序b
a
- 如果减法返回一个负数,我们就
a
先排序b
。 - 如果减法返回,我们将保留和
0
的原始顺序。a
b