在本文中,我们展示了如何在 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 教程。