在 JavaScript 中按值对地图进行排序
Sort a Map by Value in JavaScript
按值对 Map 进行排序:
- 使用扩展语法 (…) 获取 Map 条目的数组
sort()
在数组上调用方法- 将结果传递给
Map()
构造函数
索引.js
// ✅ When VALUES are NUMBERS const map2 = new Map([ ['three', 3], ['one', 1], ['two', 2], ]); // ✅ Sort by Value Ascending (low to high) const sortNumAsc = new Map([...map2].sort((a, b) => a[1] - b[1])); // 👇️ {'one' => 1, 'two' => 2, 'three' => 3} console.log(sortNumAsc); // ✅ Sort by Value Descending (high to low) const sortedNumDesc = new Map([...map2].sort((a, b) => b[1] - a[1])); // 👇️ {'three' => 3, 'two' => 2, 'one' => 1} console.log(sortedNumDesc); // ✅ When VALUES are STRINGS const map1 = new Map([ ['three', 'c'], ['one', 'a'], ['two', 'b'], ]); // ✅ Sort by Value Ascending (low to high) const sortedAsc = new Map([...map1].sort((a, b) => (a[1] > b[1] ? 1 : -1))); // 👇️ {'one' => 'a', 'two' => 'b', 'three' => 'c'} console.log(sortedAsc); // ✅ Sort by Value Descending (high to low) const sortedDesc = new Map([...map1].sort((a, b) => (a[1] > b[1] ? -1 : 1))); // 👇️ {'three' => 'c', 'two' => 'b', 'one' => 'a'} console.log(sortedDesc);
该代码片段显示了如何按值对字符串和数字值按升序和降序对 Map 进行排序。
Map对象会记住键的
插入顺序。
这就是为什么我们使用
Map()Map
构造函数以正确的顺序
创建一个新的。
扩展语法 (…)
允许我们获取包含 Map 条目的数组。
索引.js
const map2 = new Map([ ['three', 3], ['one', 1], ['two', 2], ]); // 👇️ [['three', 3], ['one', 1], ['two', 2]] console.log([...map2]);
下一步是调用数组的
sort()
方法,并向其传递一个函数。
我们传递给sort()
方法的函数定义了排序顺序。
该函数使用2
参数调用。在我们的示例中 – 2 个包含键值对的数组。
索引.js
// ✅ When VALUES are NUMBERS const map2 = new Map([ ['three', 3], ['one', 1], ['two', 2], ]); // ✅ Sort by Value Ascending (low to high) const sortNumAsc = new Map([...map2].sort((a, b) => a[1] - b[1])); // 👇️ {'one' => 1, 'two' => 2, 'three' => 3} console.log(sortNumAsc);
该sort()
方法使用以下逻辑对数组中的元素进行排序:
-
如果比较函数的返回值大于,则
先0
排序。b
a
-
如果比较函数的返回值小于,则
先0
排序。a
b
-
如果比较函数的返回值等于
0
,则保持原先的顺序a
和b
。
在上面的代码片段中:
- 如果数组中的第二个元素(值)
a
减去数组中的第二个元素b
返回的值大于0
,我们排序b
之前a
- 如果减法返回一个负数,我们就
a
先排序b
。 - 如果减法返回,我们将保留和
0
的原始顺序。a
b
如果需要按降序对 Map 进行降序排序,只需从 的值中减去 的值a
即可b
。
索引.js
// ✅ When VALUES are NUMBERS const map2 = new Map([ ['three', 3], ['one', 1], ['two', 2], ]); // ✅ Sort by Value Descending (high to low) const sortedNumDesc = new Map([...map2].sort((a, b) => b[1] - a[1])); // 👇️ {'three' => 3, 'two' => 2, 'one' => 1} console.log(sortedNumDesc);
我们使用相同的方法按字符串值对 Map 进行排序。
索引.js
// ✅ When VALUES are STRINGS const map1 = new Map([ ['three', 'c'], ['one', 'a'], ['two', 'b'], ]); // ✅ Sort by Value Ascending (low to high) const sortedAsc = new Map([...map1].sort((a, b) => (a[1] > b[1] ? 1 : -1))); // 👇️ {'one' => 'a', 'two' => 'b', 'three' => 'c'} console.log(sortedAsc);
这次我们检查数组中值的 UTF-16 编码单元值a
是否大于数组中的值,如果是则b
返回,
否则返回。1
-1
如果我们返回1
(大于 0),那么我们b
在 之前排序a
。
您可以通过更改 和 的位置来将顺序更改为1
降序
-1
。
索引.js
// ✅ When VALUES are STRINGS const map1 = new Map([ ['three', 'c'], ['one', 'a'], ['two', 'b'], ]); // ✅ Sort by Value Descending (high to low) const sortedDesc = new Map([...map1].sort((a, b) => (a[1] > b[1] ? -1 : 1))); // 👇️ {'three' => 'c', 'two' => 'b', 'one' => 'a'} console.log(sortedDesc);