在非数字后按数字顺序对字符串进行排序

时间:2018-12-04 16:43:35

标签: javascript sorting

我想对非数字后面的数字数据进行排序。例如,这是正确的顺序: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'之后。

3 个答案:

答案 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);