[英]Sort an array of strings alphabetically, numerically then by special characters
給定以下字符串數組,我一直嘗試自然地對az字符串進行排序,然后是數字字符串,最后是特殊字符。
nextSearchTerms = ["T","D","I","C","Y","O","4","K","N","800","S","1","V","(","10","'","`","B","M","[","-"," ","J","U","H","G","R","E","P"];
console.log(nextSearchTerms);
Array.prototype.naturalSort = function(){
var a, b, a1, b1, rx=/(\d+)|(\D+)/g, rd=/\d+/;
return this.sort(function(as, bs){
a= String(as).toLowerCase().match(rx);
b= String(bs).toLowerCase().match(rx);
while(a.length && b.length){
a1= a.shift();
b1= b.shift();
if (rd.test(a1) || rd.test(b1)){
if(!rd.test(a1)) return -1;
if(!rd.test(b1)) return 1;
if(a1 != b1) return a1-b1;
}
else if (a1 != b1) {
var aIsLetter = a1[0].charAt(0).match(/[a-z]/i),
bIsLetter = b1[0].charAt(0).match(/[a-z]/i);
if (aIsLetter && !bIsLetter) return -1;
if (!aIsLetter && bIsLetter) return 1;
return (a1[0] == b1[0] ? 0 : (a1[0] < b1[0] ? -1 : 1));
}
}
return a.length - b.length;
});
}
console.log(nextSearchTerms.naturalSort());
我一直試圖修改的函數返回。
[“B”,“C”,“D”,“E”,“G”,“H”,“I”,“J”,“K”,“M”,“N”,“O”,“ P“,”R“,”S“,”T“,”U“,”V“,”Y“,”“,”'“,”(“,” - “,”[“,”`“, “1”,“4”,“10”,“800”]
我想最終的數組輸出。
[“B”,“C”,“D”,“E”,“G”,“H”,“I”,“J”,“K”,“M”,“N”,“O”,“ P“,”R“,”S“,”T“,”U“,”V“,”Y“,”1“,”4“,”10“,”800“,”'“,”“ ,“ - ”,“[”,“`”,“”]
關於我缺少什么的任何建議?
這是我對你所尋找的東西的刺激。 我認為它比你擁有的更清潔:
Array.prototype.naturalSort = function() {
var stringRE = /^[A-Za-z]+$/
var numberRE = /^[\d]+$/
return this.sort(function(a, b) {
var aIsString = stringRE.test(a);
var bIsString = stringRE.test(b)
var aIsNumeric = numberRE.test(a);
var bIsNumeric = numberRE.test(b);
if (aIsString && bIsString) {
return a.localeCompare(b);
} else if (aIsNumeric && bIsNumeric) {
return parseInt(a, 10) - parseInt(b, 10);
} else if (aIsString && bIsNumeric) {
return -1;
} else if (aIsNumeric && bIsString) {
return 1;
} else if (aIsString || aIsNumeric) {
return -1;
} else if (bIsString || bIsNumeric) {
return 1;
} else {
return a.localeCompare(b);
}
})
};
var chars = ["T","D","I","C","Y","O","4","K","N","800","S","1","V","(","10","'","`","B","M","[","-"," ","J","U","H","G","R","E","P"];
console.log(chars.naturalSort());
// ["B", "C", "D", "E", "G", "H", "I", "J", "K", "M", "N", "O", "P", "R", "S", "T", "U", "V", "Y", "4", "1", "10", "800", " ", "-", "'", "(", "[", "`"]
這個怎么樣? 什么東西與數字相比......
if (rd.test(a1) || rd.test(b1)){
var aIsLetter = a1[0].charAt(0).match(/[a-z]/i),
bIsLetter = b1[0].charAt(0).match(/[a-z]/i);
if(!rd.test(a1) && aIsLetter) return -1;
if(!rd.test(a1) && !aIsLetter) return 1;
if(!rd.test(b1) && bIsLetter) return 1;
if(!rd.test(b1) && !bIsLetter) return -1;
if(a1 != b1) return a1-b1;
}
這是一個更短的解決方案:
function naturalSort(a, b) {
var aPriority = /[a-z]/i.test(a) * 3 + /\d+/i.test(a) * 2;
var bPriority = /[a-z]/i.test(b) * 3 + /\d+/i.test(b) * 2;
if (aPriority === bPriority) return a.localeCompare(b, 'en', {numeric: true});
return aPriority < bPriority ? 1: -1;
}
nextSearchTerms.sort(naturalSort)
// ["B", "C", "D", "E", "G", "H", "I", "J", "K", "M", "N", "O", "P", "R", "S", "T", "U", "V", "Y", "1", "4", "10", "800", " ", "-", "'", "(", "[", "`"]
如果我理解正確,這應該回答你的要求。 它很簡單易懂。 字母具有更高的優先級(3),數字具有2,其余的具有1.並且數組按優先級順序排序。
LE:修正了數字排序;
我想以下方法將完成所請求的任務。 實際上,該功能只是一個單線程,它利用了可鏈接的數組功能。 為了更好地理解,我將其分為三行。 按以下步驟操作;
我相信它可以進一步簡化,但到目前為止,這是我能想到的。 請指教...
var testar = ["T","D","I","C","Y","O","4","K","N","800","S","1","V","(","10","'","`","B","M","[","-"," ","J","U","H","G","R","E","P", "0", "-17"]; function naturalSort(a){ return a.reduce((p,c) => { /[AZ]/i.test(c) ? p[0].push(c) : /\\d+/.test(c) ? p[1].push(c*1) : p[2].push(c); return p }, [[],[],[]]) .reduce((p,c) => p.concat(c.sort((p,c) => p < c ? -1:1) .map(e => typeof e == "number" ? e.toString() : e)),[]); } document.write('<pre>' + JSON.stringify(naturalSort(testar), 0, 2) + '</pre>');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.