千家信息网

JavaScript中的sort方法怎么用

发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,这篇"JavaScript中的sort方法怎么用"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来
千家信息网最后更新 2025年02月04日JavaScript中的sort方法怎么用

这篇"JavaScript中的sort方法怎么用"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"JavaScript中的sort方法怎么用"文章吧。

1、举个栗子

数组中能够直接用来排序的方法有:reverse() 和 sort(),由于 reverse()方法不够灵活,才有了sort()方法。在默认情况下,sort()方法按升序排列数组。

var arr=[1,3,5,9,4];console.log(arr.sort());// 输出: [1, 3, 4, 5, 9]

这时发现数据按照从小到大排列,没问题;于是再把数组改成:var arr=[101,1,3,5,9,4,11];,再调用sort()方法打印排序结果。

var arr=[101,1,3,5,9,4,11];console.log(arr.sort());// 输出: [1, 101, 11, 3, 4, 5, 9]

这个时候发现数组101,11都排在3前面,是因为 sort() 方法会调用数组的toString()转型方法,然后比较得到的字符串,确定如何排序,即使数组中的每一项都是数值,sort()方法比较的也是字符串。

那么字符串又是怎么排序的呢,是根据字符串的unicode编码从小到大排序的。下面我们尝试打印出数组每一项的unicode编码看一下。

...// 转码方法function getUnicode (charCode) {  return charCode.charCodeAt(0).toString(16);}// 打印转码arr.forEach((n)=>{ console.log(getUnicode(String(n)))});// 输出: 31 31 31 33 34 35 39

惊奇地发现,1,101,11的字符串unicode编码都是31

2、传入比较函数以指定顺序

以上发现sort()方法不是按照我们想要的顺序排序的,那么,怎么解决呢,sort()方法可以接收一个比较函数作为参数,以便指定哪个值位于哪个值前面。

比较函数(compare)接收两个参数,如果第一个参数位于第二个之前则返回一个负数,如果两个参数相等则返回0,如果第一个参数位于第二个之后则返回一个整数。

function compare(value1,value2){ if (value1 < value2){  return -1; } else if (value1 > value2){  return 1; } else{  return 0; }}

我们把比较函数传递给sort()方法,在对arr数组进行排列,打印结果如下:

var arr=[101,1,3,5,9,4,11];console.log(arr.sort(compare));// 输出: [1, 3, 4, 5, 9, 11, 101];

可以发现排序从小到大没有什么问题。

3、对象数组的排序

sort() 方法通过传入一个比较函数来排序数字数组,但是在开发中,我们会对一个对象数组的某个属性进行排序,例如id,年龄等等,那么怎么解决呢?

要解决这个问题:我们可以定义一个函数,让它接收一个属性名,然后根据这个属性名来创建一个比较函数并作为返回值返回来(JS中函数可以作为值来使用,不仅可以像传递参数一样把一个函数传递给另一个函数,也可以将一个函数作为另一个函数的结果返回,函数作为JS中的第一等公民不是没有原因的,确实很灵活。),代码如下。

function compareFunc(prop){ return function (obj1,obj2){  var value1=obj1[prop];  var value2=obj2[prop];  if (value1 < value2){    return -1;  } else if (value1 > value2){    return 1;  } else{    return 0;  } }}

定义一个数组users,调用sort()方法传入compareFunc(prop)打印输出结果:

var users=[  {name:'tom',age:18},  {name:'lucy',age:24},  {name:'jhon',age:17},];console.log(users.sort(compareFunc('age')));// 输出结果[{name: "jhon", age: 17},{name: "tom", age: 18},{name: "lucy", age: 24}]

在默认情况下,调用sort()方法不传入比较函数时,sort()方法会调用每个对象的toString()方法来确定他们的次序,当我们调用compareFunc('age')方法创建一个比较函数,排序是按照对象的age属性排序的。

4、XML节点的排序

尽管现在很多后台返回数据就是JSON格式的,很轻量又方便解析。但是之前有个项目因为后台返回的都是XML字符串,前端拿到数据后还得进行序列化,有些需要排序,之前的排序都是把XML转换成数组对象进行排序的,这样做没有什么问题,只不过感觉代码写的很冗余麻烦。后来就突发奇想,xml获取得到也是类数组对象,把类数组对象转换成数组不就可以直接排序了么。

// 1.模拟后端返回的XML字符串var str=`   tom  18    lucy  24    jhon  17 `  // 2.定义比较函数function compareFunction(prop){ return function (a, b) {   var value1= a.getElementsByTagName(prop)[0].textContent;   var value2= b.getElementsByTagName(prop)[0].textContent;   if (value1 < value2){    return -1;   } else if (value1 > value2){    return 1;   } else{    return 0;  } }}// 3.xml字符串转换成xml对象var domParser = new DOMParser();var xmlDoc = domParser.parseFromString(str, 'text/xml');var userElements=xmlDoc.getElementsByTagName('user'));// 4.userElements类数组对象转换成数组再排序var userElements=Array.prototype.slice.call(xmlDoc.getElementsByTagName('user'));var _userElements=userElements.sort(compareFunction('age'));// 5.打印排序后的结果_userElements.forEach((user)=>{ console.log(user[xss_clean]);});

打印排序后的结果

可以发现,XML节点已经按照age从小到大排序了。

以上就是关于"JavaScript中的sort方法怎么用"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

方法 排序 数组 函数 对象 字符 字符串 结果 参数 输出 内容 从小到大 从小 属性 问题 数据 编码 两个 代码 后台 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 阿里云申请服务器 assecc数据库更新条件查询 河北环保软件开发推广 云计算大数据服务器机柜上市公司 网络安全整体协防 2年级网络安全手抄报内容 厦门讯网络技术有限公司 网络安全等级保护价格 大兴区提供软件开发质量保障 声光电法制宣传展厅软件开发 天津网络安全宣传周筹备 网络安全手抄报美丽 网络技术人员交意群 敏捷软件开发 经典书籍 淘宝上的云服务器可以直接上外网 河南工业软件开发市场报价 安徽二七一起网络技术有限 大学生校园网络安全宣传周 网络安全的初心和使命 数据库两个表的数据怎么匹配 肿瘤甲基化数据库 spno在数据库什么意思 存储柜能放服务器硬盘么 台式机怎么做服务器 大数据技术是不是数据库 2022年国家网络安全总体形势 中国网络安全组长是谁 企业级64路服务器 廊坊分动网络技术靠谱吗 软件开发无线和软件开发区别
0