JavaScript sort array——在JS中对数组元素进行排序

位置:首页>文章>详情   分类: Web前端 > 编程技术   阅读(365)   2023-06-26 07:54:31

在本文中,我们展示了如何在 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.Collat​​or 来启用对语言敏感的字符串比较。

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

地址:https://www.cundage.com/article/javascript-sort-array.html

相关阅读

Big.js 教程展示了如何使用 Big.js 模块在 JavaScript 中使用任意精度的大十进制算法。 大.js 大.js 是一个小型、快速的 JavaScript 库,用于任意精度的十进...
faker.js 教程展示了如何使用 faker.js 库在 JavaScript 中生成虚假数据。 伪造者.js 伪造者.js 是一个用于生成假数据的 JavaScript 库。构建和测试我们...
Node.js 教程是 Node.js 的入门教程。我们描述了 Node.js 并提供了一些 Node.js 代码示例。 Nojde.js 节点.js 是一个开源、跨平台的 JavaScript...
JavaScript 数组教程展示了如何在 JavaScript 中使用数组。 数组是许多值的集合。数组项称为数组的元素。每个元素都可以通过索引引用。数组是从零开始的。 JavaScript 数...
Liquid.js 教程展示了如何在 JavaScript 应用程序中使用 Liquid 模板引擎。 液体 液体 是一个 JavaScript 模板引擎。它是由 Shopify 创建的。 Liq...
Rollup.js 教程展示了如何使用 Rollup.js 模块打包器。 卷起 是一个 JavaScript 模块打包器。它将较小的代码片段编译成较大的库或应用程序包
Moment.js 教程展示了如何使用 Moment.js 模块在 JavaScript 中处理日期和时间。 时刻.js 时刻.js 是一个轻量级的 JavaScript 日期库,用于解析、验证...
Day.js 教程展示了如何使用 Day.js 模块在 JavaScript 中处理日期和时间。 日.js Day.js 是一个极简主义的 JavaScript 日期库,用于解析、验证、操作和格...
JavaScript JSON.parse 教程展示了如何将 JSON 字符串解析为 JavaScript 对象。 JSON JSON(JavaScript 对象显示法) 是一种轻量级数据交换格...
在本教程中,我们展示了如何在 JavaScript 中创建和使用模块。 模块 是 JavaScript 代码的容器。模块在单独的文件中定义。模块的目的是组织和隔离代码。 JavaScript 多...