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 字符串排序

posted @ 2022-08-25 08:51  散人长情  阅读(442)  评论(0编辑  收藏  举报