在 JavaScript 中对数组进行排序

发布于 2022-07-30 21:39:09 字数 3722 浏览 203 评论 0

JavaScript 的内置 sort() 功能 常常令初学者感到惊讶。 例如,假设您对以下数组进行了排序:

[3, 20, 100].sort();

输出会是什么? 您可能希望数组保持不变,但输出实际上将变为:

[100, 20, 3];

那是因为 JavaScript 将数组元素转换为字符串,然后 根据 JavaScript 的字符串顺序对它们进行排序

对数字数组进行排序

sort() 函数 接受一个参数, compareFunction()。这 compareFunction() 函数接受两个数组元素 ab,它应该返回:

  • 如果是负数 a < b
  • 如果是正数 a > b
  • 0 如果 a 既不大于也不小于 b

要按正序对数字数组进行排序,您应该使用 (a, b) => a - b 身为你的 compareFunction().

const arr = [3, 20, 100];

arr.sort((a, b) => a - b);
arr; // [3, 20, 100]

要以相反的顺序对数字数组进行排序,您应该使用 (a, b) => b - a 反而。

const arr = [20, 3, 100];

arr.sort((a, b) => b - a);
arr; // [100, 20, 3]

如果你熟悉Java,你可以想到 compareFunction() 作为 JavaScript 的等价物 compareTo()

按属性对对象数组进行排序

假设您想要对一组对象进行排序。 例如,假设您有一系列星际迷航:下一代角色:

const characters = [
  { firstName: 'Jean-Luc', lastName: 'Picard', rank: 'Captain', age: 59 },
  { firstName: 'Will', lastName: 'Riker', rank: 'Commander', age: 29 },
  { firstName: 'Geordi', lastName: 'La Forge', rank: 'Lieutenant', age: 29 }
];

这是您将如何排序 characters 排列方式 lastName 使用 JavaScript 字符串比较

const characters = [
  { firstName: 'Jean-Luc', lastName: 'Picard', rank: 'Captain', age: 59 },
  { firstName: 'Will', lastName: 'Riker', rank: 'Commander', age: 29 },
  { firstName: 'Geordi', lastName: 'La Forge', rank: 'Lieutenant', age: 29 }
];

characters.sort((a, b) => {
  if (a === b) {
    return 0;
  }
  return a.lastName < b.lastName ? -1 : 1;
});

// La Forge, Picard, Riker
characters;

这是您将如何排序 characters 按年龄排列:

const characters = [
  { firstName: 'Jean-Luc', lastName: 'Picard', rank: 'Captain', age: 59 },
  { firstName: 'Will', lastName: 'Riker', rank: 'Commander', age: 29 },
  { firstName: 'Geordi', lastName: 'La Forge', rank: 'Lieutenant', age: 29 }
];

characters.sort((a, b) => a.age - b.age);

// Riker, La Forge, Picard
characters;

怎么排序 rank? 按等级排序需要自定义排序,因为 JavaScript 运行时不知道 Captain 的等级高于 Lieutenant。 以下是根据自定义排序使用的排序方式 indexOf()

const characters = [
  { firstName: 'Jean-Luc', lastName: 'Picard', rank: 'Captain', age: 59 },
  { firstName: 'Will', lastName: 'Riker', rank: 'Commander', age: 29 },
  { firstName: 'Geordi', lastName: 'La Forge', rank: 'Lieutenant', age: 29 }
];

const rankOrder = new Map([
  ['Captain', 1],
  ['Commander', 2],
  ['Lieutenant', 3]
]);

characters.sort((a, b) => {
  return rankOrder.get(a.rank) - rankOrder.get(b.rank);
});

// Picard, Riker, La Forge
characters;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

野鹿林

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

烙印

文章 0 评论 0

singlesman

文章 0 评论 0

独孤求败

文章 0 评论 0

晨钟暮鼓

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文