我想对非数字后面的数字数据进行排序。例如,这是正确的顺序: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'之后。
答案 0 :(得分:0)
最简单(但不是很有效)的解决方案是在比较字符串之前在字符串中的每个数字之前插入“ 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 });
});
答案 1 :(得分:0)
从数字中拆分字符串,然后自己进行比较。
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)
答案 2 :(得分:0)
我们可以使用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);