我正在嘗試對陣列進行排序:
["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"]
所以我發現如果我像這樣切換 ever value 的位置:
["3B", "2D", "1F", "9A", "12D", "2A", "1C", "0Z", "1B"]
然后再次將它傳遞給整理器,它會給我正確的排序順序,但只是數字和字母被翻轉了。然后,我將不得不將它們翻轉回來。有沒有更好的方法來做到這一點?
uj5u.com熱心網友回復:
如果您始終只有一個字母,則可以按數字其余部分和第一個字母進行排序。
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);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/426985.html
標籤:javascript 数组 细绳 比较 整理者
