javascript数组排序

2023-05-16

    javascript原生排序算法sort(),如果不带排序函数,那么就是默认按照升序排列。如果是数字类型就按照从小到大的顺序排列,如果是字符串,就按照字母顺序排列。

/**

* Sorts an array in place.

* This method mutates the array and returns a reference to the same array.

* @param compareFn Function used to determine the order of the elements. It is expected to return

* a negative value if the first argument is less than the second argument, zero if they're equal, and a positive

* value otherwise. If omitted, the elements are sorted in ascending, ASCII character order.

* ```ts

* [11,2,22,1].sort((a, b) => a - b)

* ```

*/

sort(compareFn?: (a: T, b: T) => number): this;

    排序方法定义规定,如果带排序函数(两个参数),并且函数返回负数,一般用-1表示,表示第一个参数小于第二个参数,如果返回0,表示两个参数相等,返回正数,一般用1表示,表示第一个参数大于第二个参数。

    从这段描述来看,我们似乎并不清楚,升序排列,降序排列有什么区别?

    先来看几个简单的例子:

var arr = [1,3,4,2]
console.log(arr)
arr.sort()
console.log(arr)
//==============
var fruits = ["banana","apple","watermelon","grape","kiwifruit"]
console.log(fruits)
fruits.sort()
console.log(fruits)
//==============
var list = ["a_1","a_11","a_2","b_1","b_10","b_3"]
console.log(list)
list.sort()
console.log(list)

    运行结果:

 

    前面两个排序,纯数字和纯字母排序,默认排序是符合我们的期望的。第三个排序,它是一个字母数字的组合,默认只按照字母顺序排列,其实我们期望得到的结果是:

a_1,a_2,a_11,b_1,b_3,b_10 

     需要这样的排序结果,我们就不能只用默认的排序,我们需要自定义排序规则,我们希望先按照字母排序,字母相同则按照数字排序。这就要求排序需要按照第二个属性来排序,这里虽然是一个字符串数组,完全可以看作一个对象数组,我们不仅需要按照姓名排序,还需要按照序号排序。

    我们修改第三个排序:

var list = ["a_1","a_11","a_2","b_1","b_10","b_3"]
console.log(list)
list.sort((a,b)=>{
    var obja = a.split('_')
    var objb = b.split('_')
    var namea = obja[0]
    var nameb = objb[0]

    var ida = obja[1]
    var idb = objb[1]
    if(namea==nameb){
        return ida - idb
    }
    return namea - nameb
})
console.log(list)

    运行结果:

   

    乍一看,没毛病,正是我们需要的排序。但是我们忽略了一个问题,字符串排序不能直接和数字类型一样做减法。我们在数组中间增加一个元素"c_2",看看结果:

 

    很意外,字母排序好像没有生效。这里namea-nameb其实会做一个隐式转换,直接做减法,而字符串是不能做减法的,所以结果是NaN。并不是前面说的-1,0,1。 

     他们虽然不能做减法操作,但是却可以比较大小,namea < nameb。但是这种结果返回的是布尔类型(true,false),所以我们还需要做个转换,namea < nameb? -1 :1

还有一种判断方法,就是利用字符串函数localeCompare来比较。这个代码就不贴出来了,大家可以根据下面的截图来感受一下它的作用:

它对字符串作比较,并且返回值正好是-1,0,1三者之一,可以看作是对字符串作比较的一个封装函数。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javascript数组排序 的相关文章

  • onclick 函数上的 CSS 选择器

    有没有办法让CSS选择器onclick function 您可以在onclick https stackoverflow com questions 24365416 select element which have specific a
  • 使用 keyup 上的 Submit() 提交表单两次

    我有一个与此类似的 jQuery HTML 代码
  • 1分30秒倒计时器javascript

    我有代码 但它适用于 2 分钟计时器 我需要将其修改为 1 分 30 秒计时器 我已经尝试过 但未能从 1 30 开始计时器 因为我是这一行的初学者 并且想学习如何做到这一点 这是代码 div div
  • Sails.js - 如何更新嵌套模型

    attributes username type email validated by the ORM required true password type string required true profile firstname s
  • Visual Studio IDE 中功能后的空间

    如何设置 Visual Studio 中的设计以在我的 javascript 函数后面放置一个空格 目前 当我按下返回键时 我得到了这个 var myfunc function 当我想要这个的时候 var myfunc function 知
  • Webpack 和 Angular HTML 图像加载

    我一直对 webpack 和 Angular 感到头疼 这可能有一个简单的答案 但我无法弄清楚 我已经阅读了堆栈溢出中关于这个主题的几乎所有答案 但都无济于事 我有一个像这样的 html 页面 还有其他包含图像的模板 img
  • 如何在下拉列表中选择一个选项

    我正在使用 AngularJS 指令 我需要在模板中设置下拉列表的选定选项
  • Vue Draggable - 如何仅替换所选项目以防止移动网格上的所有其他项目?

    这是一个要测试的示例 https codesandbox io s j4vn761455 file src App vue 112 116 https codesandbox io s j4vn761455 file src App vue
  • 数据表“footerCallback”函数未在页脚中显示结果

    我尝试获取每列的总和并将结果显示在页脚中 我在用着 页脚回调 https datatables net reference option footerCallbackDatatables提供的功能 但是它在页脚中没有显示任何内容 数据表解释
  • Javascript:通过将路径作为字符串传递给对象来获取对象的深层值[重复]

    这个问题在这里已经有答案了 可能的重复 使用字符串键访问嵌套的 JavaScript 对象 https stackoverflow com questions 6491463 accessing nested javascript obje
  • 使用 Javascript eval() 100% 安全吗?

    我正在编写一个生成 Javascript 代码的 PHP 库 Javascript 代码有许多名为component001 component002 etc 页面通过 AJAX 动态加载 我需要通过 URL 变量传递组件的名称 然后由脚本进
  • jspm / jQuery / TypeScript - 模块“jquery”没有默认导出

    我正在尝试使用 TypeScript 和 jspm system js 来引导 Web 应用程序进行模块加载 我还没有走多远 安装 jspm 后 并使用它来安装 jQuery jspm install jquery 以及基础知识 main
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • 大型应用的回流/布局性能

    我正在使用 GWT 构建一个 HTML 应用程序 其性能总体上是正确的 有时 它会加载 DOM 中的许多对象 并且应用程序会变得很慢 我使用 Chrome 开发者工具分析器来查看时间花在哪里 在 Chrome 下 一旦应用程序被编译 即没有
  • 如何上传文件 - sails.js

    我可以下载图像和 pdf 但无法下载文档文件 doc pptx odt 下载文档 doc pptx odt 时 仅将其下载为 ZIP XML 文件 我可以做什么 我在用着 填写上传文件文档 https github com balderda
  • 简单的颜色变化

    我正在创建一个用户界面 用户可以在其中更改页面的颜色值 我想要的是获取分配给其背景颜色的值并将其变亮一定程度 我只是想获得一条亮点线 而不必每次都制作新图像 示例 用户将背景颜色设置为 ECECEC 现在我希望某个元素边框变成 F4F4F4
  • ES6 Reflect API 的好处

    我一直在努力升级一些代码以使用 ES6 语法 我有以下代码行 delete this foo 我的 linter 提出了使用建议 Reflect deleteProperty this foo 您可以找到该方法的文档here https d
  • 如何制作过期/签名视频嵌入网址

    我是新来的 正在学习网络开发等等 我只知道如何将我的视频嵌入网站中 任何菜鸟都可以轻松获得源代码 他们也可以嵌入它 但在许多网站中 视频 src 均使用重定向器链接进行编码 例如 它会在一段时间后过期 在本例中是一天 我了解到这是一个签名网
  • 将 Angular Web 组件 EventEmitter 监听到 javascript

    我在以下工具的帮助下创建了一个小型网络组件本文 https medium com IMM9O web components with angular d0205c9db08f使用角度元素 其中包括 Input and Output 我能够将
  • R闪亮:使用闪亮的JS从数据表中获取信息

    我想读出所有列名称以及它们在数据表中显示的顺序 由于不同的原因 我无法使用 stateSave 等选项 我对 JS 没有什么把握 但我确信用它可以完成 所以我需要你帮助我 我尝试过类似的代码片段 datatable data callbac

随机推荐

  • mysql使用join做update操纵与使用join做查询时出现重复记录的问题

    在实际处理数据过程中 xff0c 有一些数据可能会从别的地方导入过来 xff0c 两个表有关联 xff0c 但是一个表中的某一列缺失 xff0c 如果要补全 xff0c 可以利用另一个表来做填充 这里就是今天的第一个问题 xff0c 使用u
  • mac系统上通过源码编译安装opencv for java

    本人在Mac系统上尝试下载opencv源码 xff0c 然后通过cmake make make install命令编译安装 xff0c 都失败 xff0c 各种依赖缺失报错 最后通过brew install build from sourc
  • vmware安装苹果虚拟机卡在苹果图标位置不动

    计算机环境 xff1a vmware16 2 xff0c win11 xff0c macos 12 monterey xff0c macos majave 如题所示 xff0c 在vmware里面安装苹果虚拟机 xff0c 通过unlock
  • docker搭建fastdfs环境

    fastdfs是一个开源的分布式文件系统 xff0c 在实际使用中 xff0c 通过源码编译安装过程非常复杂 xff0c 但是通过docker快速构建却非常容易 下面介绍通过docker安装fastdfs的方法 docker镜像的选择也挺重
  • springboot项目结合fastdfs做文件上传

    前面一篇博客介绍通过docker构建fastdfs xff0c 并且在storage容器中通过fdfs upload file命令成功上传了一个文件 xff0c 最后通过http ip 8888 group path访问到了文件 xff0c
  • Kernel panic - not syncing: IO-APIC + timer doesn‘t work解决办法

    如题所示 xff0c 我在使用qemu system x86 64模拟器启动linux内核与busybox根文件系统组成的虚拟机的时候报错 xff0c 系统无法正常开启 xff0c 运行截图如下 xff1a 这里说的是apic和时钟无法工作
  • ubuntu源码编译busybox与linux内核并使用qemu-system-x86_64模拟启动

    busybox 1 35 0 https busybox net downloads busybox 1 35 0 tar bz2 sudo apt install make gcc libncurses dev 编译配置 xff1a 在b
  • Postgre数据库用户权限总结

    1 故事起源 我们的项目使用了PG数据库 xff0c 在项目开发阶段 xff0c 为了省事偷懒 xff0c 直接将应用连接数据库的用户给了supperuser权限 xff0c 用起来简直不要太爽 随着开发进度接近中后期 xff0c 开始筹建
  • mvn install:install-file将本地jar安装到maven本地仓库

    有一些三方jar包是远程仓库中没有的 xff0c 我们在maven项目中 xff0c 可以通过指定本地jar的方式使用它 lt dependency gt lt groupId gt org lt groupId gt lt artifac
  • linux奇技淫巧

    杀死进程 杀死进程 xff0c 一般的做法 xff0c 我们先通过ps ef 结合grep 定位进程号 然后执行kill 9 PID 有人将这个操作简化 xff0c 通过一行命令就解决 1 找进程号 ps ef grep python3 g
  • [牛客网]OR63删除公共字符

    如题所示 xff0c 该算法描述如下 xff1a 描述 输入两个字符串 xff0c 从第一字符串中删除第二个字符串中所有的字符 例如 xff0c 输入 They are students 和 aeiou xff0c 则删除之后的第一个字符串
  • svg通过虚线画形状

    svg可以做很多事情 xff0c 如今和canvas在web开发中使用越来越多 默认svg画图 xff0c 如果是空白填充 xff0c 最后展示的形状线条是实线 今天介绍一个属性 xff0c 可以上画出的图形显示虚线 这个属性就是strok
  • 通过vue ui方式构建vue+electron项目

    以前我构建vue 43 electron项目都是使用一些模版比如webpack simulatedgreg electron vue等 xff0c 这些模版在github上 xff0c 有时候可能因为网络原因下载会慢一些 后来看到一些文章介
  • vue+echarts画甘特图

    vue项目中添加echarts xff0c 只需要增加echarts依赖 xff0c 然后在main js中引入echarts就可以使用了 1 npm install echarts save 2 修改main js import as e
  • mac系统下node版本管理工具n的安装与使用

    node版本管理 xff0c 在windows和linux下都叫nvm 在mac下 xff0c 更加简洁 xff0c 直接就是n xff0c 似乎容易让人产生怀疑 xff0c 这太简洁了 xff0c n可以表示很多意思啊 这就是mac系统独
  • python输出不换行与多行注释

    默认情况下 xff0c python输出打印方法print xff0c 每一次调用都会单独输出一行内容 xff0c 有些场景下面 xff0c 我们需要输出是连在一起的 xff0c 不用单行显示 这就需要对打印做设置 xff0c 参数是end
  • vue转electron项目以及使用fs报错:Module not found: Error: Can‘t resolve ‘fs‘ in解决办法

    前面写了一篇博客 xff0c 通过vue ui创建electron 43 vue项目 xff0c 其实关键的一步就是增加vue cli plugin electron builder插件依赖 这一步可以通过界面上添加 xff0c 也可以手动
  • python将图片转矩阵

    在机器学习手写数字识别案例中 xff0c 需要将手写数字图片转矩阵向量 其实转矩阵 xff0c 就需要根据图片上像素点来组成一个矩阵 xff0c 如果把图片看作一个 长 宽 的二维矩阵 xff0c 那么矩阵中的每个点的像素表示的数字组成一个
  • ant-design-vue中this.$confirm 确认框使用

    cancelService obj let self 61 this this confirm title 39 确认提示 39 content 96 是否确认取消服务 xff1f 96 okType 39 danger 39 onOk r
  • javascript数组排序

    javascript原生排序算法sort xff0c 如果不带排序函数 xff0c 那么就是默认按照升序排列 如果是数字类型就按照从小到大的顺序排列 xff0c 如果是字符串 xff0c 就按照字母顺序排列 Sorts an array i