我有一个带有 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|
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]
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句