javascript可以像windows一样排序吗?

问题描述 投票:0回答:5

我需要一种在 Javascript 中像在 Windows 中一样对字符串进行排序的方法,但这似乎是不可能的。

Windows 资源管理器排序如下:

1.jpg - 2.jpg - 3.jpg - ....

Javascript 的排序如下:

1.jpg - 10.jpg - 11.jpg - 2.jpg -...

Windows 根据文件名中的数字值排序,而 Javascript 仅根据字符的 ASCII 代码排序。

有时文件名不仅仅是数字或文本,而是两者的组合,例如:

"mark 01 in school.jpg"
"mark 02 in school.jpg"
"john 05 in theater.jpg"

我需要的是一个如上所示排序的 Javascript 函数。

我的问题是:JS中有一个函数吗?或者我如何自己实现一个函数?

javascript jquery file sorting web
5个回答
0
投票

您必须编写自己的排序函数并将其作为参数传递给排序方法。简单的例子:

your_array.sort(sortfunction)

function sortfunction(a, b){
     var num1 = extractNumberFrom(a);
     var num2 = extractNumberFrom(b);
     return num1 - num2;
}

0
投票

只需创建一个排序回调,首先对字符串进行排序,然后检查数字并对它们进行正确排序,就像

var arr = [
    "test2.jpg",
    "test10.jpg",
    "test1.jpg",
    "test11.jpg"
]

arr.sort(function(a,b) {
    for (var i = 0; i < a.length; i++) {
        var _a = a.charAt(i), 
            _b = b.charAt(i),
            _c = _a.localeCompare(_b);
        
        if ( _c != 0 ) return isNaN(_a) || isNaN(_b) ? a.localeCompare(b) : _a - _b;
    }
    
});

document.body.innerHTML = '<pre>' + JSON.stringify(arr, null, 4) + '</pre>';


0
投票

我创建了一个

flexibleSort
函数,它首先检查数组中的所有文件名是否仅包含数字。如果它只有数字,那么它将把它作为整数/数字进行比较,否则它将把它当作字符串。

var arr_number = ["2.jpg", "1.jpg", "3.jpg"];
var arr_string = ["mark 01 in school.jpg","mark 02 in school.jpg","john 05 in theater.jpg"];
var arr_number_1 = ["1.jpg","10.jpg","11.jpg","2.jpg"];
flexibleSort(arr_number);
flexibleSort(arr_string);
flexibleSort(arr_number_1);

function flexibleSort(obj){
	var all_number = true;
	$.each(obj, function(index, value){
	    if(!$.isNumeric(value.split(".")[0])){
	    	all_number = false;
	    }
	});
	if(all_number === true){
		obj.sort(function(a, b){return parseInt(a.split(".")[0])-parseInt(b.split(".")[0])});
	}else{
		obj.sort(function(a, b){return a > b});
	}
    $.each(obj, function(index, value){
	    $('#result').append("<p>"+value+"</p>");
	});
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<div id="result"></div>


0
投票

您可以尝试以下算法进行排序。 它根据字符排序。

http://www.davekoelle.com/files/alphanum.js


0
投票

这里是应用 natsort 函数的另一个示例:

// natural sort algorithm in JavaScript by Miigon.
// 2021-03-30
// 
// GitHub: https://github.com/miigon/

function natSort(arr){
    return arr.map(v=>{ // split string into number/ascii substrings
        let processedName = []
        let str = v
        for(let i=0;i<str.length;i++) {
            let isNum = Number.isInteger(Number(str[i]));
            let j;
            for(j=i+1;j<str.length;j++) {
                if(Number.isInteger(Number(str[j]))!=isNum) {
                    break;
                }
            }
            processedName.push(isNum ? Number(str.slice(i,j)) : str.slice(i,j));
            i=j-1;
        }
        // console.log(processedName);
        return processedName;

    }).sort((a,b) => {
        let len = Math.min(a.length,b.length);
        for(let i=0;i<len;i++) {
            if(a[i]!=b[i]) {
                let isNumA = Number.isInteger(a[i]);
                let isNumB = Number.isInteger(b[i]);
                if(isNumA && isNumB) {
                    return a[i]-b[i];
                } else if(isNumA) {
                    return -1;
                } else if(isNumB) {
                    return 1;
                } else {
                    return a[i]<b[i] ? -1 : 1 ;
                }
            }
        }
        // in case of one string being a prefix of the other
        return a.length - b.length;
    }).map(v => v.join(''));
}

let a = ['a2','a1b10z','b1a2','a1b10','a33','7','a3','a22','a1b2','abbbb','a1b1','aaaaa','a10','a1','10'];

console.log(natSort(a).join('\n'))

此外,还有一个特殊软件包可以安装。

© www.soinside.com 2019 - 2024. All rights reserved.