开放的编程资料库

当前位置:我爱分享网 > JavaScript教程 > 正文

JavaScript sort array

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

未经允许不得转载:我爱分享网 » JavaScript sort array

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏