我有一個帶有 id 和 name 的哈希陣列。名稱可以有數字 字串或只有字串。目標是按字母順序排序,如果名稱中有數字,則按數字值排序。
鑒于:
array = [{id: "1", name: "Lorem 100"},
{id: "2", name: "Lorem 101"},
{id: "3", name: "Lorem 101-A"},
{id: "4", name: "Lorem 101-B"},
{id: "5", name: "Lorem 2"},
{id: "6", name: "Ipsum (Lorems 55 & 55A)"},
{id: "7", name: "Dolor"},
{id: "8", name: "Sit"},
{id: "9", name: "Amet"}]
排序如下:
sorted_array = [ {id: "9", name: "Amet"},
{id: "7", name: "Dolor"},
{id: "6", name: "Ipsum (Lorems 55 & 55A)"},
{id: "5", name: "Lorem 2"},
{id: "1", name: "Lorem 100"},
{id: "2", name: "Lorem 101"},
{id: "3", name: "Lorem 101-A"},
{id: "4", name: "Lorem 101-B"},
{id: "8", name: "Sit"}]
我試過的:
- array.sort_by { |散列| hash[:name] } -> 沒有像我想要的那樣排序,即 Lorem 100 將高于 Lorem 2
- array.sort_by { |散列| hash[:name][/\d /].to_i } -> 給出錯誤,因為并非所有哈希都有數字
向這個偉大的社區尋求任何可以幫助我解決這個問題的資源或建議。謝謝!
uj5u.com熱心網友回復:
array.sort_by { |hash|
hash[:name].split(/(\d )/).map.with_index { |part, index|
index.odd? ? part.to_i : part
}
}
使用連續數字作為分隔符拆分名稱,使用捕獲括號保留分隔符(請參閱String#split);然后將分隔符(即每個奇數元素)更改為整數,以便它們可以按數字而不是按字典順序進行比較。因此,sort_by將比較諸如["Ipsum (Lorems ", 55, " & ", 55, "A)"]. Array#<=>做直觀的事情,在哪里["Lorem ", 2]來之前["Lorem ", 101]。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/447704.html
上一篇:如何在python中重繪文本?
