2023-04-01 解决使用sort()方法对数字数组排序失效的问题,sort()方法的参数:比较函数,如何根据对象属性,将对象构成的数组进行排序?

文章目录

        • 0.回顾sort()的用法
          • 示例一:对字符数组进行排序
          • 示例二:对数字数组进行排序
        • 1.sort()无法对由两位数以上的数组元素构成的数组进行合理排序
          • 示例
          • 出现原因和解决方法
        • 2.sort()的参数——比较函数
          • 示例:使用比较函数将数字数组进行正确排序
          • 比较函数的参数
          • 比较函数不能对混搭(字符+数字)数组进行排序
        • 3.对于由对象构成的数组,如何排序?
          • 需求
          • 解决方法:使用比较函数
          • 改进一:此时只能针对age属性进行排序,把age也替换成形参,写法如下
          • 改进二:让比较函数可以使用 属性值是数字型字符串的对象属性 作为根据,进行数组排序

0.回顾sort()的用法

sort()方法是用于数组排序的,语法如下:array.sort(),
使用sort()方法后会改变原数组的顺序(而不是生成一个新数组,同时原数组保持不变)

示例一:对字符数组进行排序
    var myarr1=["h","e","l","l","o"];
    myarr1.sort();
    console.log(myarr1);//(5) ['e', 'h', 'l', 'l', 'o']

sort中没有参数时,会按照数组元素对应的ASCII码进行比较和排序

示例二:对数字数组进行排序
    var myarr2=[9,5,1,4,6];
    myarr2.sort();
    console.log(myarr2);//(5) [1, 4, 5, 6, 9]

1.sort()无法对由两位数以上的数组元素构成的数组进行合理排序

示例
    var myarr2=[10,25,3,8];
    myarr2.sort();
    console.log(myarr2);//10 25 3 8
出现原因和解决方法

因为sort()方法会首先会调用每个数组数据项的toString()方法,
转换成字符串以后再进行比较,在字符串中"25"<“3”,
解决方法是需要用到sort的参数,此时这个参数叫做比较函数

2.sort()的参数——比较函数

示例:使用比较函数将数字数组进行正确排序
 	var myarr2=[10,25,3,8];
    var mycompare=function (x,y){
      if(x<y) return -1;
      else if(x>y) return 1
      else return 0;
    };
    myarr2.sort(mycompare);
    console.log(myarr2);//(4) [3, 8, 10, 25]
比较函数的参数

比较函数会接受两个参数,并对两者进行比较

  • 若第一个参数应位于第二个参数之前,则返回一个负数
  • 若第一个参数等于第二个参数,则返回0
  • 若第一个参数应位于第二个参数之后,则返回一个正数

通过以上逻辑的比较函数,会使数组最后变为升序排列,
若要变为降序,只需返回一个负数变为返回一个正数即可(正数变负数,负数变正数)

比较函数不能对混搭(字符+数字)数组进行排序
    var myarr3=["h",10];
    myarr3.sort(mycompare);
    console.log(myarr3);//(2) ['h', 10]
    myarr3.sort();
    console.log(myarr3);//(2) [10, 'h']

不能将比较函数用于比较一个不能转化成数字的字符串和数组的排序,
这是因为比较函数会先将字符串转化成数字再比较,当字符串不能转换成数字时,就不能比较大小(不用比较函数,也就是sort不加参数时,比较的是ASCII值,此时可以比较)
正确用法:

    // 对于不能转换成数字的字符串(字母型字符串),不使用比较参数,直接比较ASCII值
    var myarr3=["h",10];
    myarr3.sort();
    console.log(myarr3);//(2) ['h', 10]
    // 对于可以转换成数字的字符串(数字型字符串),使用比较函数转换成数字再比较
    var myarr4=["23",37,"1",14];
    myarr4.sort(mycompare);
    console.log(myarr4);//(4) ['1', 14, '23', 37]

总结:
数组中既有字符串又有数字时,先看看其中的字符串是字母型字符串还是数字型字符串,

若是字母型字符串,sort不用带参数,直接比较ASCII值
若是数字型字符串,sort带参数,让比较函数将字符串转换成数字再比较

3.对于由对象构成的数组,如何排序?

需求

数组项是对象,现在需要根据对象的某个属性,对数组进行排序

	//要求根据对象属性age对数组进行排序
    var arr=[
      {age:10,name:'Tom'},
      {age:8,name:'Jack'},
      {age:20,name:'Michel'},
      {age:12,name:'Daniel'},
    ];
解决方法:使用比较函数
    var compare = function (obj1, obj2) {
        if (obj1.age < obj2.age) return -1;
        else if (obj1.age > obj2.age) return 1;
        else return 0;
    } 
    console.log(arr.sort(compare));

效果:

{age: 8, name: 'Jack'}
{age: 10, name: 'Tom'}
{age: 12, name: 'Daniel'}
{age: 20, name: 'Michel'}
改进一:此时只能针对age属性进行排序,把age也替换成形参,写法如下
    var compare = function (prop){
      return function (obj1, obj2) {
        if (obj1.age < obj2.age) return -1;
        else if (obj1.age > obj2.age) return 1;
        else return 0;
      } 
    }
    console.log(arr.sort(compare('age')));//调用比较函数时要指定对象属性

此时仍有一个缺点,若对象属性age中的属性值从数字变为字符串(25==>“25”),那么仍然不会得到正确排序,因为两个数字型字符串比较大小时会比较它们的ASCII大小,而我们期望的结果是它们转换成数字后比较大小
因此仍需给比较函数再进行改进

改进二:让比较函数可以使用 属性值是数字型字符串的对象属性 作为根据,进行数组排序
    var arr2=[{age:"25",name:"zhangsan"},{age:"9",name:"lisi"}];
    var compare = function (prop){
      return function (obj1, obj2) {
        var val1 = obj1[prop], val2 = obj2[prop];
        // 如果是数字型字符串,就先转化成数字再比较
        if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
            val1 = Number(val1);
            val2 = Number(val2);
        }
        // 其他部分不变
        if (val1 < val2) return -1;
        else if (val1 > val2) return 1;
        else return 0;
      } 
    }
    console.log(arr2.sort(compare('age')));

效果:

{age: '9', name: 'lisi'}
{age: '25', name: 'zhangsan'}

以上就是对数组对象进行排序的最终比较函数的代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/5166.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux基础之计算机基础

一、计算机基础 &#xff08;1) 计算机发展&#xff1a;电子管、晶体管、集成电路、大规模集成电路 &#xff08;2) 冯诺依曼体系&#xff1a;用二进制表示数据和指令&#xff1b; 存储程序控制&#xff0c;程序和数据预先存入存储器&#xff1b; 计算机系统5大部分&#xf…

ChatGPT 出现严重技术漏洞,“当红炸子鸡”翻车了?

ChatGPT翻车了吗&#xff1f; 最近爆火的ChatGPT出现了严重技术漏洞&#xff0c;用户在社交媒体上表示看到了其他人的历史搜索记录标题。 一名推特用户21日发文称&#xff0c;“如果你使用ChatGPT请小心&#xff01;你的聊天记录可能会被分享给其他用户&#xff01;今天&#…

Unity创建自定义脚本模板

创建脚本自定义模板脚本模板自定义脚本模板Script Templates脚本模板 在我们在unity中创建脚本并打开时都会出现这样的代码 using System.Collections; using System.Collections.Generic; using UnityEngine;public class test : MonoBehaviour {// Start is called before …

文件操作—IO

文件操作—IO&#x1f50e;认识文件&#x1f33b;文件的组织结构&#x1f33b;文件的相对路径与绝对路径&#x1f33c;根据相对路径寻找文件&#x1f33b;二进制文件与文本文件&#x1f50e;文件系统操作&#x1f33b;File类的用法&#x1f33c;构造 file 对象&#x1f33c;创建…

力扣刷题笔记21——两个链表的第一个公共节点/栈方法和双指针法

两个链表的第一个公共节点/栈方法和双指针法问题我的代码(栈)示例代码(双指针)问题 来自力扣&#xff1a; 输入两个链表&#xff0c;找出它们的第一个公共节点。 如下面的两个链表&#xff1a; 在节点 c1 开始相交。 示例 1&#xff1a; 输入&#xff1a;intersectVal …

Typescript快速入门

文章目录TypeScript简介TypeScript安装第一行TypeScript代码TypeScript的主要特点编译和擦除类型类型推断定义类型联合类型泛型泛型函数&#xff1a;泛型类&#xff1a;接口描述对象的形状&#xff1a;描述函数类型&#xff1a;实现接口的类&#xff1a;运行 .ts 文件的方法方法…

TCP连接的三次握手和连接释放的四次挥手图文详解

什么是TCP连接&#xff1f; TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。在简化的计算机网络OSI模型中&#xff0c;它完成第四层传输层所指定的功能&#xff0c;用户数据报协议是同一层内另一个重要的传输协议。在因特网协议族中&#xff0c;TCP层是位于IP层之…

ijkplayer 源码分析(1):初始化流程

一、ijkplayer 初始化流程 本文是基于 A4ijkplayer 项目进行 ijkplayer 源码分析&#xff0c;该项目是将 ijkplayer 改成基于 CMake 编译&#xff0c;可导入 Android Studio 编译运行&#xff0c;方便代码查找、函数跳转、单步调试、调用栈跟踪等。 初始化完成的主要工作是创建…

Gitlab中Pipeline语法三

Pipeline语法三 only/except/rules/workflow only和except 用分支策略来限制jobs构建: only 定义哪些分支和标签的git项目将会被job执行except定义哪些分支和标签的git项目将不会被job执行 rules 构建规则 rules允许按顺序评估单个规则,直到匹配并为作业动态提供属性rule…

Python3,自从掌握了这个方法,再也不用print进行调试了。

PySnooper妙用1、引言2、代码实战2.1 介绍2.2 安装2.3 示例3、总结1、引言 小屌丝&#xff1a;鱼哥&#xff0c;调试代码&#xff0c;除了Debug&#xff0c;还有什么其他的神器没&#xff1f; 小鱼&#xff1a;额… 你这是要飞天吗&#xff1f; 小屌丝&#xff1a;我很低调的好…

集合之ArrayList

学习不要眼高手低&#xff0c;学习是一点点积累的。即使你现在很菜&#xff0c;坚持学一个学期不会差的&#xff01;只要花时间学习&#xff0c;每天都是进步的&#xff0c;这些进步可能你现在看不到&#xff0c;但是不要小瞧了积累效应&#xff0c;30天&#xff0c;60天&#…

JetBrains GoLand 2022.3 Crack

GoLand 2022.3 提供性能增强&#xff0c; 以及泛型和 Go 工作区的新功能。 我们集成了 Go Playground&#xff0c;添加了对改进 Go 文档评论的支持&#xff0c; 引入了 HTTP 客户端和 Docker 的新功能&#xff0c; 并使新 UI 可用。 像往常一样&#xff0c;您会发现Web开发和数…

Python使用深度神经网络对高光谱图像进行土地覆盖分类

一、前言高光谱成像是遥感中的一项重要技术&#xff0c;它收集从可见光到近红外波长的电磁波谱。 高光谱成像传感器通常提供来自地球表面同一区域的数百个窄光谱带。 在高光谱图像 (HSI) 中&#xff0c;每个像素都可以看作是一个高维向量&#xff0c;其条目对应于特定波长的光谱…

Vue项目的打包上线步骤

Vue项目的打包上线步骤一、打包之前的路由模式二、性能分析和CDN的应用2.1 性能分析2.2 webpack排除打包2.3 CDN文件配置2.4 注入CDN文件到模板一、打包之前的路由模式 两种路由模式 hash模式 &#xff1a; #后面是路由路径&#xff0c;特点是前端访问&#xff0c;#后面的变化不…

[架构之路-144]-《软考-系统分析师》- 7-企业信息化战略与实施-1-概念、方法、与企业战略/IT战略/业务重组的关系

前言&#xff1a;所谓系统&#xff0c;系统是由相互作用相互依赖的若干组成部分结合而成的&#xff0c;具有特定功能的有机整体&#xff0c;而且这个有机整体又是它从属的更大系统的组成部分。任何现实世界的一定的活动范围&#xff0c;都是系统&#xff0c;任何计算机组成的软…

泰克示波器校准失败

全球每10位工程师中就有8位信赖泰克示波器&#xff0c;帮助他们诊断和测试明天的设计&#xff0c;泰克拥有全部的示波器系列&#xff0c;丰富的产品功能&#xff0c;广泛的分析功能&#xff0c;然而示波器会随着使用年限、使用频率以及操作等出现各种各样的问题&#xff0c;那么…

【深入理解二叉树OJ题】

文章目录一、单值二叉树二、二叉树最大深度三、翻转二叉树四、检查两棵树是否相同五、对称二叉树六、二叉树遍历一、单值二叉树 航班直达&#xff01; 前序遍历的思想。 思路&#xff1a;先判断左右节点是否存在&#xff0c;再判断根分别和左右节点的值是 否相等。 1.如果左…

智联物联分享之物联网协议MQTT简述,MQTT协议特点

接触过物联网设备的朋友们对于MQTT应该都不陌生吧&#xff0c;那MQTT是什么呢&#xff1f;智联物联小编为大家分享下MQTT的简述与特点。 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;基于客户端/服务器的信息发布/订阅的物联网常用传输协议。1999年由开发…

今年面试好激烈!

金三银四过去一半&#xff0c;市场火热&#xff0c;但是大家就业压力却没有缓解多少。 很多粉丝后台留言&#xff0c;Java程序员面临的竞争太激烈了…… 我自己也有实感&#xff0c;多年身处一线互联网公司&#xff0c;虽没有直面过求职跳槽的残酷&#xff0c;但经常担任技术面…

主成分分析(PCA)原理

主成分分析&#xff08;PCA&#xff09;原理 在高维数据处理中&#xff0c;为了简化计算量以及储存空间&#xff0c;需要对这些高维数据进行一定程度上的降维&#xff0c;并尽量保证数据的不失真。PCA和ICA是两种常用的降维方法。 PCA&#xff1a;principal component analysi…
最新文章