深入理解js数组的sort排序

关于“深入理解js数组的sort排序”,我可以提供以下攻略:

一、sort排序的基本用法

sort是JavaScript中数组的一种方法,用于给数组排序。基本用法如下:

array.sort(compareFunction)

其中,array是需要排序的数组,compareFunction是比较函数,可以是可选的。如果指定了比较函数,它将决定排序的顺序。如果未指定比较函数,则按字母顺序对元素进行排序:

const fruits = ['apple', 'banana', 'orange', 'lemon']
fruits.sort()
console.log(fruits) // ['apple', 'banana', 'lemon', 'orange']

可以看到,由于没有指定比较函数,sort方法按字母顺序对元素进行排序。

如果要按数字大小对元素排序,比较函数可以这样写:

const numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
numbers.sort((a, b) => {
  return a - b
})
console.log(numbers) // [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

这里指定了一个比较函数,使用箭头函数的形式。比较函数中返回的是a - b,这是一个简单的比较方式,如果它的结果是正数,则a排在b后面,如果结果是负数,则a排在b前面,如果结果是0,则顺序不变。

二、完整的sort排序过程

1.排序算法

sort方法使用的是一种叫做快速排序的算法。快速排序的过程可以分为三个步骤:分割、排序和合并。

分割:将数组分成两个子数组,分割的位置取决于选择的枢轴值(pivot value)。枢轴值可以是数组中的任意元素,但最好选择中间位置的元素。

排序:对分割得到的两个子数组进行排序。

合并:将排序后的子数组合并成一个有序的数组。

2.比较函数

如果指定了比较函数,它将决定排序的顺序。比较函数有以下规定:

  • 如果比较函数的返回值为负数,表示第一个元素在排序后应该排在第二个元素的前面;
  • 如果返回值为0,表示两个元素相等,顺序不变;
  • 如果返回值为正数,表示第二个元素在排序后应该排在第一个元素的前面。

3.具体实现

当对一个数组进行排序时,sort会按照以下步骤进行操作:

  • 如果数组只包含一个元素或为空,返回该数组;
  • 选择一个枢轴值;
  • 将数组分割成两个子数组,比枢轴值小的元素放在左边,大的放在右边;
  • 对子数组进行排序,使用递归的方式;
  • 合并左右两个子数组,并将枢轴值放在中间。

这样就得到了一个排序后的数组。

三、示例说明

下面是针对数组里包含对象的情况的两个示例:

1.根据对象属性排序

假设有这样一个数组:

const people = [
  { name: 'mike', age: 25 },
  { name: 'jane', age: 29 },
  { name: 'john', age: 20 },
]

现在要按年龄大小对这个数组进行排序,可以使用比较函数:

people.sort((a, b) => {
  return a.age - b.age
})

这个比较函数比较简单,直接比较对象的age属性,按照年龄大小进行排序。

2.根据对象多个属性排序

如果要按照多个属性进行排序,则需要修改比较函数。假设有这样一个数组:

const people = [
  { name: 'mike', age: 25, score: 80 },
  { name: 'jane', age: 29, score: 90 },
  { name: 'john', age: 20, score: 75 },
  { name: 'sarah', age: 20, score: 85 },
]

现在要按照年龄和分数对这个数组进行排序,可以使用比较函数:

people.sort((a, b) => {
  if (a.age === b.age) {
    return b.score - a.score
  }
  return a.age - b.age
})

这个比较函数比较复杂,先比较对象的age属性,如果相等,则比较score属性,按照分数降序排序。如果age属性不相等,则按照年龄升序排序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解js数组的sort排序 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • JS实现使用POST方式发送请求

    JS实现使用POST方式发送请求的步骤如下: 创建一个XMLHttpRequest对象 在发送POST请求之前,需要先创建一个XMLHttpRequest对象。可以使用以下代码创建: let xhr = new XMLHttpRequest(); 设置请求的处理函数 在发送实际的请求之前,需要先设置请求的处理函数。这些函数在请求的不同阶段会被自动调用。可以使…

    JavaScript 2023年5月27日
    00
  • javascript中将Object转换为String函数代码 (json str)

    将JavaScript中的Object对象转换成字符串的过程叫做序列化,通常使用JSON.stringify()函数来进行转换。以下是完整的攻略: 1. 使用JSON.stringify()函数进行转换 JSON.stringify()函数将给定的JavaScript对象或值转换成一个JSON字符串。该函数接受三个参数: 要转换的值。 可选参数,替换方式,可…

    JavaScript 2023年5月27日
    00
  • Javascript实现跨域后台设置拦截的方法详解

    下面是“Javascript实现跨域后台设置拦截的方法详解”的完整攻略。 什么是跨域 跨域指的是在一个网页加载另一个网页的资源时,由于受到安全限制,无法读取对方资源的问题。比如从A站点的网页向B站点发送AJAX请求的过程中,如果B站点的资源不允许A站点的请求,就会产生跨域问题。 为什么需要防止跨域 跨域攻击是指攻击者利用目标网站对跨域问题的缺乏安全防范措施,…

    JavaScript 2023年6月11日
    00
  • javascript if条件判断方法小结

    下面为大家详细讲解“JavaScript if条件判断方法小结”的完整攻略。 1. if条件语句 if语句是JavaScript中最常用的条件判断语句。它的基本语法结构如下: if (condition) { // 如果condition为真,则执行这里的代码 } else { // 如果condition为假,则执行这里的代码 } 其中,condition…

    JavaScript 2023年6月10日
    00
  • 纯JS实现出生日期[年月日]下拉菜单效果

    下面是详细讲解纯JS实现出生日期[年月日]下拉菜单效果的攻略: 1. HTML结构 首先,我们需要在HTML页面中创建一个select元素,有3个下拉菜单选项分别代表出生日期的年、月、日。 <select id="year"></select> <select id="month">…

    JavaScript 2023年6月10日
    00
  • JS正则表达式验证账号、手机号、电话和邮箱是否合法

    下面我将介绍使用JavaScript正则表达式来验证账号、手机号、电话和邮箱是否合法的方法。 验证账号 账号的验证规则是由字母、数字、下划线组成的,长度为4-16位。我们可以使用正则表达式来进行验证。具体代码如下: function validateUsername(username) { var pattern = /^[a-zA-Z0-9_]{4,16}…

    JavaScript 2023年6月10日
    00
  • JavaScript中Function与Object的关系

    JavaScript中Function与Object的关系 在JavaScript中,Function和Object的关系是非常密切的,因为Function就是一种特殊的Object。在JavaScript中,一切皆为对象,不仅包括原始类型(如数字、字符串),也包括函数。 Function是Object的一个子类 在JavaScript中,Function也…

    JavaScript 2023年5月27日
    00
  • js Array操作的最简短最容易理解方法

    下面就为大家详细讲解一下“js Array操作的最简短最容易理解方法”的完整攻略。 操作数组的方法 在JavaScript中,我们可以使用许多方法来操作数组,包括以下几个: push()方法 push()方法可以向数组末尾添加新元素。 const fruits = [‘apple’, ‘banana’]; fruits.push(‘orange’); con…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部