JavaScript 数组排序
最后修改于 2023 年 10 月 18 日
在本文中,我们将展示如何在 JavaScript 中对数组元素进行排序。
排序
排序是将元素按顺序排列。 已经开发了多种算法来执行排序,包括归并排序、快速排序、选择排序或冒泡排序。
排序的相反操作,即将元素序列重新排列成随机或无意义的顺序,称为洗牌。
我们可以按字母顺序或数字顺序对数据进行排序。 排序键指定用于执行排序的条件。 可以按多个键对对象进行排序。 例如,在对用户进行排序时,用户的姓名可以用作主要排序键,而他们的职业可以用作次要排序键。
内置的 sort 函数对数组的元素进行原位排序并返回排序后的数组。 它接受一个可选的比较函数作为参数。 该函数用于确定元素的顺序。 如果第一个参数小于第二个参数,则返回负值;如果它们相等,则返回零;否则返回正值。
JS 数组默认排序
默认情况下,数字按升序排序,字符串也按字母顺序升序排序。
let vals = [-3, 3, 0, 1, 5, -1, -2, 8, 7, 6];
let words = ['sky', 'blue', 'nord', 'cup', 'lemon', 'new'];
vals.sort();
console.log(vals.join(' '));
words.sort();
console.log(words.join(' '));
此示例对数字和单词的数组进行排序。
$ node core.js -1 -2 -3 0 1 3 5 6 7 8 blue cup lemon new nord sky
JS 数组降序排序
为了按降序排序值,我们需要提供一个自定义的比较函数。
let vals = [-3, 3, 0, 1, 5, -1, -2, 8, 7, 6];
let words = ['sky', 'blue', 'nord', 'cup', 'lemon', 'new'];
vals.sort((a, b) => b - a);
console.log(vals.join(' '));
words.sort((a, b) => {
if (a === b) {
return 0;
}
return b < a ? -1 : 1;
});
console.log(words.join(' '));
我们按降序对整数和字符串数组进行排序。
$ node main.js 8 7 6 5 3 1 0 -1 -2 -3 sky nord new lemon cup blue
JS 数组排序字符串,不区分大小写
为了以不区分大小写的方式比较字符串,我们在比较的元素上调用 toLowerCase 函数。
let words = ["world", "War", "abbot", "Caesar", "castle", "sky", "den",
"forest", "ocean", "water", "falcon", "owl", "rain", "Earth"];
function icase(e1, e2) {
if (e1.toLowerCase() === e2.toLowerCase()) return 0;
return e1.toLowerCase() < e2.toLowerCase() ? -1 : 1;
}
words.sort(icase);
console.log(words.join(' '));
此示例对字符串数组进行排序,不区分大小写。
$ node main.js abbot Caesar castle den Earth falcon forest ocean owl rain sky War water world
JS 按字符串长度排序
在下一个示例中,我们按字符串的长度对字符串数组进行排序。
let words = ['brown', 'war', 'a', 'falcon', 'tradition',
'no', 'boot', 'ellipse', 'strength'];
let bylen = (e1, e2) => e1.length - e2.length;
let bylendesc = (e1, e2) => e2.length - e1.length;
words.sort(bylen);
console.log(words.join('\n'));
words.sort(bylendesc);
console.log(words.join('\n'));
我们使用 length 函数来获取排序元素的大小。
$ node main.js a no war boot brown falcon ellipse strength tradition tradition strength ellipse falcon brown boot war no a
JS 按姓氏排序姓名
当我们想按姓氏对姓名进行排序时,假设整个姓名是一个字符串,我们需要提供一个自定义的比较方法。
let users = ['John Doe', 'Lucy Smith', 'Benjamin Young', 'Robert Brown',
'Thomas Moore', 'Linda Black', 'Adam Smith', 'Jane Smith'];
function bysur(n1, n2) {
let sname1 = n1.split(' ')[1];
let sname2 = n2.split(' ')[1];
if (sname1 > sname2) return 1;
if (sname1 < sname2) return -1;
return 0;
}
users.sort(bysur);
console.log(users);
我们将字符串分成两部分,并比较字符串的第二部分。
$ node main.js
[
'Linda Black',
'Robert Brown',
'John Doe',
'Thomas Moore',
'Lucy Smith',
'Adam Smith',
'Jane Smith',
'Benjamin Young'
]
JS 排序对象数组
在下面的示例中,我们对对象数组进行排序。
let users = [
{ fname: 'John', lname: 'Doe', salary: 1230 },
{ fname: 'Roger', lname: 'Roe', salary: 3130 },
{ fname: 'Lucy', lname: 'Novak', salary: 670 },
{ fname: 'Ben', lname: 'Walter', salary: 2050 },
{ fname: 'Robin', lname: 'Brown', salary: 2300 },
{ fname: 'Joe', lname: 'Draker', salary: 1190 },
{ fname: 'Janet', lname: 'Doe', salary: 980 }
];
users.sort((e1, e2) => e1.salary - e2.salary)
console.log(users);
console.log('---------------------');
users.sort((e1, e2) => e2.salary - e1.salary)
console.log(users);
我们有一个用户列表。 用户先按工资升序排序,然后降序排序。
$ node main.js
[
{ fname: 'Lucy', lname: 'Novak', salary: 670 },
{ fname: 'Janet', lname: 'Doe', salary: 980 },
{ fname: 'Joe', lname: 'Draker', salary: 1190 },
{ fname: 'John', lname: 'Doe', salary: 1230 },
{ fname: 'Ben', lname: 'Walter', salary: 2050 },
{ fname: 'Robin', lname: 'Brown', salary: 2300 },
{ fname: 'Roger', lname: 'Roe', salary: 3130 }
]
---------------------
[
{ fname: 'Roger', lname: 'Roe', salary: 3130 },
{ fname: 'Robin', lname: 'Brown', salary: 2300 },
{ fname: 'Ben', lname: 'Walter', salary: 2050 },
{ fname: 'John', lname: 'Doe', salary: 1230 },
{ fname: 'Joe', lname: 'Draker', salary: 1190 },
{ fname: 'Janet', lname: 'Doe', salary: 980 },
{ fname: 'Lucy', lname: 'Novak', salary: 670 }
]
JS 按多个字段排序
以下示例按多个字段对用户对象进行排序。
let users = [
{ fname: "John", lname: "Doe", salary: 1230 },
{ fname: "Lucy", lname: "Novak", salary: 670 },
{ fname: "Ben", lname: "Walter", salary: 2050 },
{ fname: "Robin", lname: "Brown", salary: 2300 },
{ fname: "Amy", lname: "Doe", salary: 1250 },
{ fname: "Joe", lname: "Draker", salary: 1190 },
{ fname: "Janet", lname: "Doe", salary: 980 },
{ fname: "Albert", lname: "Novak", salary: 1930 }
];
users.sort((e1, e2) => {
return e1.lname.localeCompare(e2.lname) || e2.salary - e1.salary
});
console.log(users);
我们首先按姓氏,然后按工资对用户进行排序。 我们使用 || 运算符。
$ node main.js
[
{ fname: 'Robin', lname: 'Brown', salary: 2300 },
{ fname: 'Amy', lname: 'Doe', salary: 1250 },
{ fname: 'John', lname: 'Doe', salary: 1230 },
{ fname: 'Janet', lname: 'Doe', salary: 980 },
{ fname: 'Joe', lname: 'Draker', salary: 1190 },
{ fname: 'Albert', lname: 'Novak', salary: 1930 },
{ fname: 'Lucy', lname: 'Novak', salary: 670 },
{ fname: 'Ben', lname: 'Walter', salary: 2050 }
]
JS 按带重音符号的字符串排序
为了对带重音符号的字符串进行排序,我们可以使用 Intl.Collator,它支持语言敏感的字符串比较。
const words = ['čaj', 'auto', 'drevo', 'cibuľa', 'čučoriedka', 'banán',
'čerešňa', 'ďateľ', 'červený', 'čierny', 'cesnak'];
words.sort(new Intl.Collator('sk').compare);
console.log(words.join(' '));
此示例对斯洛伐克语单词进行排序。
来源
在本文中,我们在 JavaScript 中对数组进行了排序。