簡體   English   中英

在非數字后按數字順序對字符串進行排序

[英]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.

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