对字母数字字符串进行排序 - 字母在前

问题描述 投票:0回答:2
var List = ["F", "60", "59", "6", "7", "7'", "60'", "60a", "c1", "A", "5", "a1", "6.2", "A'", "B", "A1"];

var sortedListe = List.sort(function (a, b) {
  var collator = new Intl.Collator('en', { numeric: true, sensitivity: "base" });
  return collator.compare(a, b);
});

console.log(sortedListe);

我得到的:[“5”,“6”,“6.2”,“7”,“7'”,“59”,“60”,“60'”,“60a”,“A”,“A '", "a1", "A1", "B", "c1", "F"]

https://jsfiddle.net/5coraw0z/

PRO:6.2 排在 7 之前; 7'也处于正确的位置; c1 位于 B 和 F 之间。 CONTRA:以字母开头的字符串位于列表末尾。

我的预期结果:["A", "A'", "a1", "A1", "B", "c1", "F", "5", "6", "6.2", "7" 、“7'”、“59”、“60”、“60'”、“60a”]

javascript arrays sorting alphanumeric
2个回答
0
投票

如果您需要非标准排序规则,通常更容易对数组的每个部分进行单独排序,而不是发明一个复杂的排序回调:

function partition(ary, fn) {
    let res = [[], []]
    for (let x of ary)
        res[fn(x) ? 1 : 0].push(x)
    return res
}

let List = ["F", "60", "59", "6", "7", "7'", "60'", "60a", "c1", "A", "5", "a1", "6.2", "A'", "B", "A1"];

let collator = new Intl.Collator('en', { numeric: true, sensitivity: "base" });

let sortedListe = [].concat(
  ...partition(List, x => !isNaN(x[0]))
    .map(a => a.sort(collator.compare)))

console.log(...sortedListe);


0
投票

const list = ["F", "60", "59", "6", "7", "7'", "60a", "60'", "c1", "A", "5", "a1", "6.2", "A'", "B", "A1"];

const gainNum = (str, idx) => {
  let out = '';
  for(;idx < str.length; idx++){
    const c = str[idx];
    if( (+c).toString() !== c ) break;
    out += c;
  }
  return [out, out ? idx - 1 : idx];
}

function sort(aa, bb, ai = 0, bi = 0) {

  let a = aa[ai], b = bb[bi];

  if(!a && b) return -1;
  if(a && !b) return 1;
  if(!a && !b) return 0;
  
  let anum, bnum;
  
  [anum, ai] = gainNum(aa, ai);
  [bnum, bi] = gainNum(bb, bi);
  
  if(anum && bnum){
    return anum - bnum || sort(aa, bb, ai + 1, bi + 1);
  }
  
  if(anum && !bnum) return 1;
  if(bnum && !anum) return -1;
  
  a = a.toLowerCase();
  b = b.toLowerCase();
  
  return a === b ? sort(aa, bb, ai + 1, bi + 1) : a > b ? 1 : -1;
}

console.log('expected:', ...["A", "A'", "a1", "A1", "B", "c1", "F", "5", "6", "6.2", "7", "7'", "59", "60", "60'", "60a"]);

console.log('sorted  :', ...list.slice().sort(sort));

© www.soinside.com 2019 - 2024. All rights reserved.