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的值来排序,这里有个风 ...
随机推荐
- 拉格朗日插值优化DP
拉格朗日插值优化DP 模拟赛出现神秘插值,太难啦!! 回忆拉格朗日插值是用来做什么的 对于一个多项式\(F(x)\),如果已知它的次数为\(m - 1\),且已知\(m\)个点值,那么可以得到 \[F ...
- LcdTools如何编写MIPI指令(初始化代码)
在LcdTools帮助文档中查看MIPI读写指令描述,如下图 编写LCM初始化代码就是配置LCM Driver IC寄存器值,一般只需用MipiWrite()指令写参数即可:下面介绍MipiWrite ...
- The XOR Largest Pair(字典树)
题目描述 在给定的 N 个整数 A1,A2,-,AN 中选出两个进行异或运算,得到的结果最大是多少? 输入格式 第一行一个整数 N. 第二行 N 个整数 Ai. 输出格式 一个整数表示答案. 样例 ...
- POC、EXP、SRC概念厘清
「POC」 POC可以看成是一段验证的代码,就像是一个证据,能够证明漏洞的真实性,能证明漏洞的存在即可. https://zhuanlan.zhihu.com/p/26832890 「EXP」 ...
- 基于LZO的高性能无损数据解压缩IP
LZOAccel-D LZO Data Decompression Core/无损数据解压缩IP Core LZOAccel-D是一个无损数据解压缩引擎的FPGA硬件实现,兼容LZO 2.10标准. ...
- 前端html和css总结
1.html知识总结 1.1 表格的的相关属性 属性 表示 border-collapse 设置表格的边框是否被合并为一个单一的边框 cellpadding 单元格边距 cellspacing 单元格 ...
- 从BeanFactory源码看Bean的生命周期
下图是我搜索"Spring Bean生命周期"找到的图片,来自文章--Spring Bean的生命周期 下面,我们从AbstractAutowireCapableBeanFacto ...
- SpringBoot 03: 常用web组件 - - - 拦截器 + Servlet + 过滤器
常用web组件 拦截器 Servlet 过滤器 使用思想 创建自定义类 实现或者继承框架里的接口或类 将自定义类注册到框架中 使用自定义类 拦截器 说明 拦截器是SpringMVC中的一种对象,能拦截 ...
- 2022-11-14 Acwing每日一题
本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我会认真改正的.同时也希望 ...
- 深入理解Golang 闭包,直通面试
大家好 今天为大家讲解的面试专题是: 闭包. 定义 闭包在计算机科学中的定义是:在函数内部引用了函数内部变量的函数. 看完定义后,我陷入了沉思...确实,如果之前没有接触过闭包或者对闭包不理解的话,这 ...