ZetCode

JavaScript 数组排序

最后修改于 2023 年 10 月 18 日

在本文中,我们将展示如何在 JavaScript 中对数组元素进行排序。

排序

排序是将元素按顺序排列。 已经开发了多种算法来执行排序,包括归并排序、快速排序、选择排序或冒泡排序。

排序的相反操作,即将元素序列重新排列成随机或无意义的顺序,称为洗牌。

我们可以按字母顺序或数字顺序对数据进行排序。 排序键指定用于执行排序的条件。 可以按多个键对对象进行排序。 例如,在对用户进行排序时,用户的姓名可以用作主要排序键,而他们的职业可以用作次要排序键。

内置的 sort 函数对数组的元素进行原位排序并返回排序后的数组。 它接受一个可选的比较函数作为参数。 该函数用于确定元素的顺序。 如果第一个参数小于第二个参数,则返回负值;如果它们相等,则返回零;否则返回正值。

JS 数组默认排序

默认情况下,数字按升序排序,字符串也按字母顺序升序排序。

main.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 数组降序排序

为了按降序排序值,我们需要提供一个自定义的比较函数。

main.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 函数。

main.js
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 按字符串长度排序

在下一个示例中,我们按字符串的长度对字符串数组进行排序。

main.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 按姓氏排序姓名

当我们想按姓氏对姓名进行排序时,假设整个姓名是一个字符串,我们需要提供一个自定义的比较方法。

main.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 排序对象数组

在下面的示例中,我们对对象数组进行排序。

main.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 按多个字段排序

以下示例按多个字段对用户对象进行排序。

main.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,它支持语言敏感的字符串比较。

main.js
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 中对数组进行了排序。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

查看 所有 JavaScript 教程。