在 JavaScript 中按值对 Map 进行排序

按值对 Map 进行排序:

  • 使用展开语法 (...) 获取 Map 条目的数组
  • 在数组上调用 sort() 方法
  • 将结果传递给 Map() 构造函数
// ✅ 当 VALUES 是 NUMBERS
const map2 = new Map([
  ['three', 3],
  ['one', 1],
  ['two', 2],
]);

// ✅ 按值升序排序(从低到高)
const sortNumAsc = new Map([...map2].sort((a, b) => a[1] - b[1]));

// 👇️ {'one' => 1, 'two' => 2, 'three' => 3}
console.log(sortNumAsc);

// ✅ 按值降序排序(从高到低)
const sortedNumDesc = new Map([...map2].sort((a, b) => b[1] - a[1]));

// 👇️ {'three' => 3, 'two' => 2, 'one' => 1}
console.log(sortedNumDesc);

// ✅ 当值是字符串时
const map1 = new Map([
  ['three', 'c'],
  ['one', 'a'],
  ['two', 'b'],
]);

// ✅ 按值升序排序(从低到高)
const sortedAsc = new Map([...map1].sort((a, b) => (a[1] > b[1] ? 1 : -1)));

// 👇️ {'one' => 'a', 'two' => 'b', 'three' => 'c'}
console.log(sortedAsc);

// ✅ 按值降序排序(从高到低)
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 条目的数组。

const map2 = new Map([
  ['three', 3],
  ['one', 1],
  ['two', 2],
]);

// 👇️ [['three', 3], ['one', 1], ['two', 2]]
console.log([...map2]);

下一步是调用数组的 sort() 方法,并传递给它一个函数。

我们传递给 sort() 方法的函数定义了排序顺序。

该函数使用 2 个参数调用。 在我们的示例中 – 2 个包含键值对的数组。

/ ✅ 当 VALUESNUMBERS
const map2 = new Map([
  ['three', 3],
  ['one', 1],
  ['two', 2],
]);

// ✅ 按值升序排序(从低到高)
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 进行降序排序,只需将 b 的值减去 a 的值即可。

// ✅ 当 VALUES 是 NUMBERS
const map2 = new Map([
  ['three', 3],
  ['one', 1],
  ['two', 2],
]);

// ✅ 按值降序排序(从高到低)
const sortedNumDesc = new Map([...map2].sort((a, b) => b[1] - a[1]));

// 👇️ {'three' => 3, 'two' => 2, 'one' => 1}
console.log(sortedNumDesc);

我们使用相同的方法按字符串值对 Map 进行排序。

// ✅ 当 VALUES 是 字符串
const map1 = new Map([
  ['three', 'c'],
  ['one', 'a'],
  ['two', 'b'],
]);

// ✅ 按值升序排序(从低到高)
const sortedAsc = new Map([...map1].sort((a, b) => (a[1] > b[1] ? 1 : -1)));

// 👇️ {'one' => 'a', 'two' => 'b', 'three' => 'c'}
console.log(sortedAsc);

这次我们检查 a 数组中值的 UTF-16 编码单元值是否大于 b 数组中的值,如果大于则返回 1,否则返回 -1。

如果我们返回 1(大于 0),那么我们将 b 排序在 a 之前。

我们可以通过更改 1 和 -1 的位置来将排序更改为降序。

// ✅ 当 VALUES 是 字符串
const map1 = new Map([
  ['three', 'c'],
  ['one', 'a'],
  ['two', 'b'],
]);

// ✅ 按值降序排序(从高到低)
const sortedDesc = new Map([...map1].sort((a, b) => (a[1] > b[1] ? -1 : 1)));

// 👇️ {'three' => 'c', 'two' => 'b', 'one' => 'a'}
console.log(sortedDesc);
免责声明:
1.本站所有内容由本站原创、网络转载、消息撰写、网友投稿等几部分组成。
2.本站原创文字内容若未经特别声明,则遵循协议CC3.0共享协议,转载请务必注明原文链接。
3.本站部分来源于网络转载的文章信息是出于传递更多信息之目的,不意味着赞同其观点。
4.本站所有源码与软件均为原作者提供,仅供学习和研究使用。
5.如您对本网站的相关版权有任何异议,或者认为侵犯了您的合法权益,请及时通知我们处理。
火焰兔 » 在 JavaScript 中按值对 Map 进行排序