Js文件名 排序
参考了别人帖子后,调整之后的排序方法,更加精确。(参考链接在底部)
压缩版
- 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}
正常版
- /**
- * 比较字符串
- * @param str1
- * @param str2
- */
- function strCompare(str1, str2) {
- // 处理数据为null的情况
- 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) { // 如果在该字符前,两个串都一样,str2更短,则str1较大
- 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;
- }
- /**
- * 判断是否为数字
- * @param obj
- * @returns
- */
- function isNumber(obj) {
- if (parseFloat(obj).toString() == "NaN") {
- return false;
- }
- return true;
- }
- /**
- * 比较两个数字数组
- *
- * @param numberArray1
- * @param numberArray2
- */
- function compareNumberArray(numberArray1, numberArray2) {
- for (let i = 0; i < numberArray1.length; i++) {
- if (numberArray2.length < i + 1) { // 此时数字数组2比1短,直接返回
- return 1;
- }
- let compareResult = parseInt(numberArray1[i]) - parseInt(numberArray2[i]);
- if (compareResult != 0) {
- return compareResult;
- }
- }
- // 说明数组1比数组2短,返回小于
- return -1;
- }
调用方式
- let arr = ["5栋", "7栋", "4栋", "4.5栋", "4.1栋", "4栋", "15栋", "24栋"];
- arr.sort(function(str1, str2) {
- return strCompare(str1, str2)
- });
参考链接 JS更好的字符串排序(字母顺序+数字大小排序)_编程小龙的博客-CSDN博客_js 字符串排序
Js文件名 排序的更多相关文章
- Qt 自定义model实现文件系统的文件名排序(重定义sort函数即可。忽然开窍了:其实捕捉点击Header事件,内部重排序,全部刷新显示即可)
前段时间,需要做一个功能是要做文件系统的排序的功能.由于是自己写的model, 自己定义的数据结构.最初的想法只有一个自己去实现文件夹跟文件名的排序算法,不过感觉比较费时间.后来想到的是QFileSy ...
- Qt 自定义model实现文件系统的文件名排序
前段时间,需要做一个功能是要做文件系统的排序的功能.由于是自己写的model, 自己定义的数据结构.最初的想法只有一个自己去实现文件夹跟文件名的排序算法,不过感觉比较费时间.后来想到的是QFileSy ...
- 转:js,jQuery 排序的实现,网页标签排序的实现,标签排序
js,jQuery 排序的实现: 重点: 想要实现排序,最简单的方法就是 先把标签用jQuery读进对象数组 用js排序好对象数组 (针对对象数组进行排序, 不要试图直接对网页的内容进行直接更改) 用 ...
- js拼音排序
js拼音排序 var arr =['a','c','b','b']; arr.sort( function compareFunction(p1, p2) { return p1.localeComp ...
- Table Dragger - 简单的 JS 拖放排序表格插件
Table Dragger 是一个极简的实现拖放排序的表格插件,纯 JavaScript 库,不依赖 jQuery.用于构建操作方便的拖放排序功能,超级容易设置,有平滑的动画,支持触摸事件. 在线演示 ...
- [js] - 关于js的排序sort
js的排序sort并不能一次排序好 function solution(nums){ return nums.sort(sortNumber); } function sortNumber(a, b) ...
- JS优先队列排序。出队时,先找出优先级最高的元素,再按照先进先出出队。
JS优先队列排序.出队时,先找出优先级最高的元素,再按照先进先出出队. /* * 优先队列 * 出队时,先找出优先级最高的元素,再按照先进先出出队. * */ function Queue(){ th ...
- Windows资源管理器文件名排序
Windows资源管理器文件名排序 Windows资源管理器文件名排序 背景:自然排序 什么是自然排序? 怎样按自然排序的规则进行排序? 基于Python的解决方案 参考材料 这学期担任了本科生教学助 ...
- Js中文排序(拼音首字母)
演示地址:http://lar5.sinaapp.com/ 1.index.html <html xmlns="http://www.w3.org/1999/xhtml"&g ...
- js自定义排序
摘要 有个js对象数组 var ary=[{id:1,name:"b"},{id:2,name:"b"}] 需求是根据name 或者 id的值来排序,这里有个风 ...
随机推荐
- IDEAidea导入Scala包
IDEAidea导入Scala包 一.配置windows的scala的环境变量 二.IDEA导入scala插件 1.如图步骤导入IDEA的scala插件 三.添加本地的scala目录 这时候我们应该在 ...
- 不允许还有Java程序员不了解BlockingQueue阻塞队列的实现原理
我们平时开发中好像很少使用到BlockingQueue(阻塞队列),比如我们想要存储一组数据的时候会使用ArrayList,想要存储键值对数据会使用HashMap,在什么场景下需要用到Blocking ...
- misc办公室爱情
隐藏文字password2 编辑 word改后缀zip解开后document.xml找到password1 编辑 True_lOve_i2_supReMe 用wbs43open+密码解密pdf ...
- 【翻译】Spring Security - 如何解决WebSecurityConfigurerAdapter类已被弃用的问题?
原文链接:Spring Security - How to Fix WebSecurityConfigurerAdapter Deprecated 原文作者:Nam Ha Minh 原文发表日期:20 ...
- vue引用MarkDown(mavonEditor)编辑器,文档
mavonEditor Install mavon-editor (安装) npm install mavon-editor --save 如何引入: 全局引用: // 全局注册 import Vue ...
- 如何精简 Prometheus 的指标和存储占用
前言 随着 Prometheus 监控的组件.数量.指标越来越多,Prometheus 对计算性能的要求会越来越高,存储占用也会越来越多. 在这种情况下,要优化 Prometheus 性能, 优化存储 ...
- 基于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 ...
- ARMv8之memory model和Observability(四)
最近在学习整理ARMv8的memory 相关知识,对memory的各种概念搞的头痛,太难读了!!有幸看看窝窝大神整理了部分知识,关键是讲解的地道,透彻.因此在这里学习并转载一下,也希望能够和大家一起探 ...
- 网络编程:多进程实现TCP服务端并发、互斥锁代码实操、线程理论、创建线程的两种方式、线程的诸多特性、GIL全局解释器锁、验证GIL的存在
目录 多进程实现TCP服务端并发 互斥锁代码实操 线程理论 创建线程的两种方式 线程的诸多特性 GIL全局解释器锁 验证GIL的存在 GIL与普通互斥锁 python多线程是否有用 死锁现象 多进程实 ...
- float16与float32转换
// based on https://gist.github.com/martin-kallman/5049614 // float32 // Martin Kallman // // Fast h ...