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”]
如果您需要非标准排序规则,通常更容易对数组的每个部分进行单独排序,而不是发明一个复杂的排序回调:
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);
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));