我正在尝试对数组进行排序:
["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"]
然后再次将其传递到整理器中,它会给我正确的排序序列,但只是数字和字母被翻转。然后我就得把它们翻回来。有更好的方法吗?
最佳答案
如果您始终只有一个字母,则可以按数字其余部分和第一个字母进行排序。
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);
关于javascript - 如何先按数字排序,再按字母顺序排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71123541/