在 JavaScript 中对数组进行排序
JavaScript 的内置 sort()
功能 常常令初学者感到惊讶。 例如,假设您对以下数组进行了排序:
[3, 20, 100].sort();
输出会是什么? 您可能希望数组保持不变,但输出实际上将变为:
[100, 20, 3];
那是因为 JavaScript 将数组元素转换为字符串,然后 根据 JavaScript 的字符串顺序对它们进行排序 。
对数字数组进行排序
这 sort()
函数 接受一个参数, compareFunction()
。这 compareFunction()
函数接受两个数组元素 a
和 b
,它应该返回:
- 如果是负数
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 技术交流群。
上一篇: Vue 模板编译器简介
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论