在本文中,我们展示了如何在 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 中对数组进行了排序。
列出所有 JavaScript 教程。
