簡體   English   中英

按預期順序對字符串進行排序

[英]Sort the strings in intended order

我有字符串數組

sample0
sample1
sample11
sample12
sample13
sample14
sample2
sample21
sample3

但是我需要這樣。 我不知道解決方案。 前綴可能不會一直采樣。

sample0
sample1
sample2
sample3
sample11
sample12
sample13
sample14
sample21

使用正則表達式/\\d+$/可以將字符串末尾顯示的數字與Array的sort()進行匹配,如下所示:

 var strArr = ['sample0', 'sample1', 'sample11', 'sample12', 'sample13', 'sample14', 'sample2', 'sample21', 'sample3']; var strRes = strArr.sort(function(a, b){ return a.match(/\\d+$/) - b.match(/\\d+$/); }) console.log(strRes); 

注意:這只會從末尾提取數字,並將根據該數字進行排序。

解決方案1:

var arr = ['sample0', 'sample1', 'sample11', 'sample12', 'sample13', 'sample14', 'sample2', 'sample21', 'sample3']
arr.sort(function (a, b) {
    return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' });
});
console.log(arr);

localeCompare()方法返回一個數字,該數字指示參考字符串是按排序順序位於給定字符串之前還是之后還是與之相同。

參考: https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare

解決方案2:

function naturalCompare(a, b) {
    var ax = [], bx = [];
    a.replace(/(\d+)|(\D+)/g, function(_, $1, $2) { ax.push([$1 || Infinity, $2 || ""]) });
    b.replace(/(\d+)|(\D+)/g, function(_, $1, $2) { bx.push([$1 || Infinity, $2 || ""]) });

    while(ax.length && bx.length) {
        var an = ax.shift();
        var bn = bx.shift();
        var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
        if(nn) return nn;
    }
    return ax.length - bx.length;
}

arr.sort(naturalCompare);
console.log(arr);

此解決方案來自https://stackoverflow.com/a/15479354/3910232

如果前綴“ sample”是常量,則

   var numString=['sample1','sample12','sample123','sample2','sample0','sample23'];

    var num=new Array(numString.length); 
    for (var i = 0; i < numString.length; i++) {
    num[i]=numString[i].substring(6);
    }
    var st=numString[0].substring(0,6);
    num.sort();
    var ne=(st + num.join(';' + st)).split(';');
    alert(ne);

智能排序包可以完成此任務。 我確定還有其他解決方案。 查找關鍵字“自然排序”和“智能排序”。

var collator = new Intl.Collator(undefined, {numeric: true, sensitivity: 'base'});
var myArray = ['sample1', 'sample12', 'sample3'];
myArray.sort(collator.compare);

試試看

 var array = ['sample0','sample1','sample11','sample12','sample13', 'sample14','sample2','sample21','sample3'] var sortedArray = array.sort(function(a, b){ var regXStr = /[^a-zA-Z]/g, regXNum = /[^0-9]/g; var aStr = a.replace(regXStr, "").toLowerCase(); var bStr = b.replace(regXStr, "").toLowerCase(); if(aStr === bStr) { var aNum = parseInt(a.replace(regXNum, ""), 10); var bNum = parseInt(b.replace(regXNum, ""), 10); return aNum === bNum ? 0 : aNum > bNum ? 1 : -1; } else { return aStr > bStr ? 1 : -1; } }); console.log(sortedArray) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM