参考了别人帖子后,调整之后的排序方法,更加精确。(参考链接在底部)

压缩版

  1. function strCompare(str1,str2){if(str1==undefined&&str2==undefined){return 0}if(str1==undefined){return-1}if(str2==undefined){return 1}let c1;let c2;let regexArr=['-','_','—','~','·'],canRegex=/[^0-9\.]/g;if(canRegex.test(str1)&&canRegex.test(str2)){for(let i=0;i<regexArr.length;i++){let regex=eval('(/[^0-9\\'+regexArr[i]+'\\.]/g)');let tps1=str1.replace(/\.[0-9a-zA-Z]+$/,'');let tps2=str2.replace(/\.[0-9a-zA-Z]+$/,'');if(!regex.test(tps1)&&!regex.test(tps2)){let numberArray1=tps1.split(regexArr[i]);let numberArray2=tps2.split(regexArr[i]);return compareNumberArray(numberArray1,numberArray2)}}}for(let i=0;i<str1.length;i++){c1=str1[i];if(i>str2.length-1){return 1}c2=str2[i];if(isNumber(c1)&&isNumber(c2)){let numStr1="";let numStr2="";for(let j=i;j<str1.length;j++){c1=str1[j];if(!isNumber(c1)&&c1!=='.'){break}numStr1+=c1}for(let j=i;j<str2.length;j++){c2=str2[j];if(!isNumber(c2)&&c2!=='.'){break}numStr2+=c2}let numberArray1=numStr1.split('.');let numberArray2=numStr2.split('.');return compareNumberArray(numberArray1,numberArray2)}if(c1!=c2){return c1-c2}}return 0}function isNumber(obj){if(parseFloat(obj).toString()=="NaN"){return false}return true}function compareNumberArray(numberArray1,numberArray2){for(let i=0;i<numberArray1.length;i++){if(numberArray2.length<i+1){return 1}let compareResult=parseInt(numberArray1[i])-parseInt(numberArray2[i]);if(compareResult!=0){return compareResult}}return-1}

正常版

  1. /**
  2. * 比较字符串
  3. * @param str1
  4. * @param str2
  5. */
  6. function strCompare(str1, str2) {
  7. // 处理数据为null的情况
  8. if (str1 == undefined && str2 == undefined) {
  9. return 0;
  10. }
  11. if (str1 == undefined) {
  12. return -1;
  13. }
  14. if (str2 == undefined) {
  15. return 1;
  16. }
  17.  
  18. // 比较字符串中的每个字符
  19. let c1;
  20. let c2;
  21.  
  22. let regexArr = ['-', '_', '—', '~', '·'], canRegex = /[^0-9\.]/g;
  23. // 如果都不是数字格式(含有其它内容)
  24. if (canRegex.test(str1) && canRegex.test(str2)) {
  25. for (let i = 0; i < regexArr.length; i++) {
  26. let regex = eval('(/[^0-9\\' + regexArr[i] + '\\.]/g)');
  27. // 去除后缀
  28. let tps1 = str1.replace(/\.[0-9a-zA-Z]+$/, '');
  29. let tps2 = str2.replace(/\.[0-9a-zA-Z]+$/, '');
  30. // 如果在名字正则要求范围内(没有正则以外的值)
  31. if (!regex.test(tps1) && !regex.test(tps2)) {
  32. // 转换为字符串数组
  33. let numberArray1 = tps1.split(regexArr[i]);
  34. let numberArray2 = tps2.split(regexArr[i]);
  35. return compareNumberArray(numberArray1, numberArray2);
  36. }
  37. }
  38. }
  39.  
  40. // 逐字比较返回结果
  41. for (let i = 0; i < str1.length; i++) {
  42. c1 = str1[i];
  43. if (i > str2.length - 1) { // 如果在该字符前,两个串都一样,str2更短,则str1较大
  44. return 1;
  45. }
  46. c2 = str2[i];
  47. // 如果都是数字的话,则需要考虑多位数的情况,取出完整的数字字符串,转化为数字再进行比较
  48. if (isNumber(c1) && isNumber(c2)) {
  49. let numStr1 = "";
  50. let numStr2 = "";
  51. // 获取数字部分字符串
  52. for (let j = i; j < str1.length; j++) {
  53. c1 = str1[j];
  54. if (!isNumber(c1) && c1 !== '.') { // 不是数字则直接退出循环
  55. break;
  56. }
  57. numStr1 += c1;
  58. }
  59. for (let j = i; j < str2.length; j++) {
  60. c2 = str2[j];
  61. if (!isNumber(c2) && c2 !== '.') {
  62. break;
  63. }
  64. numStr2 += c2;
  65. }
  66. // 将带小数点的数字转换为数字字符串数组
  67. let numberArray1 = numStr1.split('.');
  68. let numberArray2 = numStr2.split('.');
  69. return compareNumberArray(numberArray1, numberArray2);
  70. }
  71.  
  72. // 不是数字的比较方式
  73. if (c1 != c2) {
  74. return c1 - c2;
  75. }
  76. }
  77. return 0;
  78. }
  79.  
  80. /**
  81. * 判断是否为数字
  82. * @param obj
  83. * @returns
  84. */
  85. function isNumber(obj) {
  86. if (parseFloat(obj).toString() == "NaN") {
  87. return false;
  88. }
  89. return true;
  90. }
  91.  
  92. /**
  93. * 比较两个数字数组
  94. *
  95. * @param numberArray1
  96. * @param numberArray2
  97. */
  98. function compareNumberArray(numberArray1, numberArray2) {
  99. for (let i = 0; i < numberArray1.length; i++) {
  100. if (numberArray2.length < i + 1) { // 此时数字数组2比1短,直接返回
  101. return 1;
  102. }
  103. let compareResult = parseInt(numberArray1[i]) - parseInt(numberArray2[i]);
  104. if (compareResult != 0) {
  105. return compareResult;
  106. }
  107. }
  108. // 说明数组1比数组2短,返回小于
  109. return -1;
  110. }

调用方式

  1. let arr = ["5栋", "7栋", "4栋", "4.5栋", "4.1栋", "4栋", "15栋", "24栋"];
  2. arr.sort(function(str1, str2) {
  3. return strCompare(str1, str2)
  4. });

参考链接 JS更好的字符串排序(字母顺序+数字大小排序)_编程小龙的博客-CSDN博客_js 字符串排序

Js文件名 排序的更多相关文章

  1. Qt 自定义model实现文件系统的文件名排序(重定义sort函数即可。忽然开窍了:其实捕捉点击Header事件,内部重排序,全部刷新显示即可)

    前段时间,需要做一个功能是要做文件系统的排序的功能.由于是自己写的model, 自己定义的数据结构.最初的想法只有一个自己去实现文件夹跟文件名的排序算法,不过感觉比较费时间.后来想到的是QFileSy ...

  2. Qt 自定义model实现文件系统的文件名排序

    前段时间,需要做一个功能是要做文件系统的排序的功能.由于是自己写的model, 自己定义的数据结构.最初的想法只有一个自己去实现文件夹跟文件名的排序算法,不过感觉比较费时间.后来想到的是QFileSy ...

  3. 转:js,jQuery 排序的实现,网页标签排序的实现,标签排序

    js,jQuery 排序的实现: 重点: 想要实现排序,最简单的方法就是 先把标签用jQuery读进对象数组 用js排序好对象数组 (针对对象数组进行排序, 不要试图直接对网页的内容进行直接更改) 用 ...

  4. js拼音排序

    js拼音排序 var arr =['a','c','b','b']; arr.sort( function compareFunction(p1, p2) { return p1.localeComp ...

  5. Table Dragger - 简单的 JS 拖放排序表格插件

    Table Dragger 是一个极简的实现拖放排序的表格插件,纯 JavaScript 库,不依赖 jQuery.用于构建操作方便的拖放排序功能,超级容易设置,有平滑的动画,支持触摸事件. 在线演示 ...

  6. [js] - 关于js的排序sort

    js的排序sort并不能一次排序好 function solution(nums){ return nums.sort(sortNumber); } function sortNumber(a, b) ...

  7. JS优先队列排序。出队时,先找出优先级最高的元素,再按照先进先出出队。

    JS优先队列排序.出队时,先找出优先级最高的元素,再按照先进先出出队. /* * 优先队列 * 出队时,先找出优先级最高的元素,再按照先进先出出队. * */ function Queue(){ th ...

  8. Windows资源管理器文件名排序

    Windows资源管理器文件名排序 Windows资源管理器文件名排序 背景:自然排序 什么是自然排序? 怎样按自然排序的规则进行排序? 基于Python的解决方案 参考材料 这学期担任了本科生教学助 ...

  9. Js中文排序(拼音首字母)

    演示地址:http://lar5.sinaapp.com/ 1.index.html <html xmlns="http://www.w3.org/1999/xhtml"&g ...

  10. js自定义排序

    摘要 有个js对象数组 var ary=[{id:1,name:"b"},{id:2,name:"b"}] 需求是根据name 或者 id的值来排序,这里有个风 ...

随机推荐

  1. IDEAidea导入Scala包

    IDEAidea导入Scala包 一.配置windows的scala的环境变量 二.IDEA导入scala插件 1.如图步骤导入IDEA的scala插件 三.添加本地的scala目录 这时候我们应该在 ...

  2. 不允许还有Java程序员不了解BlockingQueue阻塞队列的实现原理

    我们平时开发中好像很少使用到BlockingQueue(阻塞队列),比如我们想要存储一组数据的时候会使用ArrayList,想要存储键值对数据会使用HashMap,在什么场景下需要用到Blocking ...

  3. misc办公室爱情

    ​ 隐藏文字password2 ​编辑 word改后缀zip解开后document.xml找到password1 ​编辑 True_lOve_i2_supReMe 用wbs43open+密码解密pdf ...

  4. 【翻译】Spring Security - 如何解决WebSecurityConfigurerAdapter类已被弃用的问题?

    原文链接:Spring Security - How to Fix WebSecurityConfigurerAdapter Deprecated 原文作者:Nam Ha Minh 原文发表日期:20 ...

  5. vue引用MarkDown(mavonEditor)编辑器,文档

    mavonEditor Install mavon-editor (安装) npm install mavon-editor --save 如何引入: 全局引用: // 全局注册 import Vue ...

  6. 如何精简 Prometheus 的指标和存储占用

    前言 随着 Prometheus 监控的组件.数量.指标越来越多,Prometheus 对计算性能的要求会越来越高,存储占用也会越来越多. 在这种情况下,要优化 Prometheus 性能, 优化存储 ...

  7. 基于python的数学建模---分支定界算法

    zip函数 a = [1,2,3,4]b = [5,6,7,8]i = sum(x * y for x, y in zip(a, b))print(i)70 floor and ceil 函数 imp ...

  8. ARMv8之memory model和Observability(四)

    最近在学习整理ARMv8的memory 相关知识,对memory的各种概念搞的头痛,太难读了!!有幸看看窝窝大神整理了部分知识,关键是讲解的地道,透彻.因此在这里学习并转载一下,也希望能够和大家一起探 ...

  9. 网络编程:多进程实现TCP服务端并发、互斥锁代码实操、线程理论、创建线程的两种方式、线程的诸多特性、GIL全局解释器锁、验证GIL的存在

    目录 多进程实现TCP服务端并发 互斥锁代码实操 线程理论 创建线程的两种方式 线程的诸多特性 GIL全局解释器锁 验证GIL的存在 GIL与普通互斥锁 python多线程是否有用 死锁现象 多进程实 ...

  10. float16与float32转换

    // based on https://gist.github.com/martin-kallman/5049614 // float32 // Martin Kallman // // Fast h ...