如何先按數字再按字母排序

我正在嘗試對數組進行排序:

["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"]

然后再把它傳給collator,它會給我正確的排序順序,但是數字和字母是翻轉的。然后我得把它們翻回去。有更好的方法嗎?

? 最佳回答:

如果你總是有一個字母,你可以按數字和第一個字母排序。

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);

主站蜘蛛池模板: 国产不卡视频一区二区三区| 免费高清在线影片一区| 人妻体体内射精一区二区| 视频在线一区二区三区| 亚洲AV香蕉一区区二区三区| 国产在线不卡一区二区三区| 国产精品一区二区久久沈樵| 亚洲国产精品无码第一区二区三区| 中文字幕无线码一区| 一区二区福利视频| 波多野结衣一区二区三区高清在线 | 日韩高清一区二区三区不卡| 亚洲AV无码一区二区三区人| 日韩精品无码免费一区二区三区| 国产一区二区电影| 午夜福利av无码一区二区| 日韩精品一区二区三区四区| 亚洲啪啪综合AV一区| 国产一区二区中文字幕| 在线精品亚洲一区二区小说| 视频一区精品自拍| 国产av成人一区二区三区| 岛国无码av不卡一区二区| 国产一区二区不卡在线播放| 国产情侣一区二区三区| 真实国产乱子伦精品一区二区三区| 一区二区在线视频观看| 久久国产精品一区| 国产一区二区三区免费| 亚洲伦理一区二区| 日本午夜精品一区二区三区电影| 久久久精品一区二区三区| 日本不卡一区二区三区| 人妻激情偷乱视频一区二区三区| 无码av免费一区二区三区| 精品视频一区二区三区四区| 亚洲无圣光一区二区| 日韩精品一区在线| 中文字幕精品一区| 国产精品高清一区二区三区不卡 | 无码人妻一区二区三区免费 |