[英]Sort strings numerically after non-numeric
我想對非數字后面的數字數據進行排序。 例如,這是正確的順序: ab,ax,a1,a2,a10,bb,b3,b10
我試過了,
list.sort(function(a,b) { return a.localeCompare(b, 'en', {numeric:true });});
但它返回: a1,a2,a10,ab,ax,b3,b10,bb
注意我會發布一個答案,但是如果更好的話,我會接受另一個答案。
編輯 :澄清一下,我需要一個數字順序在數字之后的數字順序,但否則順序是通常的a,b,c ...所以'bb'在'a10'之后排序。
最簡單(但不是很有效)的解決方案是在比較字符串之前在字符串中的每個數字之前插入“ zz”。
function prep(a) { return a.replace(/(\D)(\d)/g,'$1zz$2'); }
var list=['a1','a10','ab','ax','a2'];
list.sort(function(a,b) {
return prep(a).localeCompare(prep(b),'en', {numeric:true });
});
從數字中拆分字符串,然后自己進行比較。
var strs = ['ab','ax','a1','a2','a10', 'ab2', 'ab1'] strs.sort( (a,b) => { let aParts = a.match(/(\\D*)?(\\d+)?/) let bParts = b.match(/(\\D*)?(\\d+)?/) if (aParts[1] === bParts[1]) { return (+aParts[2] > +bParts[2]) ? 1 : -1 } else if ((aParts[1] && !aParts[2]) || (bParts[1] && !bParts[2])) { return !bParts[2] ? 1 : -1 } else { return aParts[1].localeCompare(bParts[1], 'en') } }) console.log(strs)
我們可以使用reduce
將數字和非數字數據分成兩個數組。 然后,我們將它們單獨排序,並使用concat
進行組合。
list
.reduce((acc, item, index) => {
let i = +/\d/g.test(item);
acc[i] ? acc[i].push(item) : acc[i] = [item];
return acc;
}, []),
result = list[0].sort().concat(
list[1].sort((a, b) => a.localeCompare(b, "en", {numeric: true})
));
let list = ['a10', 'ab', 'aa', 'a1', 'a2', 'ax'] .reduce((acc, item, index) => { let i = +/\\d/g.test(item); acc[i] ? acc[i].push(item) : acc[i] = [item]; return acc; }, []), result = list[0].sort().concat( list[1].sort((a, b) => a.localeCompare(b, "en", {numeric: true}) )); console.log(result);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.