如何先按数字排序然后按字母排序

How to sort by Numbers first then Alphabetical

我正在尝试对数组进行排序:

["B3", "D2", "F1", "A9", "D12", "A2", "C1", "Z0", "B1"]

预期的输出应该是:

["Z0", "B1", "C1", "F1", "A2", "D2", "B3", "A9", "D12"]

这是我的代码:

let array = ["B3", "D2", "F1", "A9", "D12", "A2", "C1", "Z0", "B1"];
let collator = new Intl.Collator(undefined, {
  numeric: true,
  sensitivity: "base",
});
console.log(array.sort(collator.compare));

输出首先按字母排序,得到:

["A2", "A9", "B1", "B3", "C1", "D2", "D12", "F1", "Z0"]

所以我发现如果我像这样切换每个值的位置:

["3B", "2D", "1F", "9A", "12D", "2A", "1C", "0Z", "1B"]

然后再次将它传递给 collat​​or,它会给我正确的排序顺序,但只是数字和字母被翻转了。然后我必须将它们翻转回来。有更好的方法吗?

如果您始终只有一个字母,则可以按其余数字和第一个字母排序。

const
    array = ["B3", "D2", "F1", "A9", "D12", "A2", "C1", "Z0", "B1"];

array.sort((a, b) => a.slice(1) - b.slice(1) || a[0].localeCompare(b[0]));

console.log(...array);

如果你有多个字母,你可以采用正则表达式,只得到数字和非数字,分隔成一个对象。

const
    getValues = string => ({
        letters: string.match(/\D+/)[0],
        digits: string.match(/\d+/)[0]
    }),
    array = ["B3", "D2", "F1", "A9", "D12", "A2", "C1", "Z0", "B1"];

array.sort((a, b) => {
    const [aa, bb] = [a, b].map(getValues);

    return aa.digits - bb.digits
        || aa.letters.localeCompare(bb.letters);
});

console.log(...array);