给定哈希数组,按字母顺序排序,然后按数字排序
Given array of hashes, sort alphabetically then by number
我有一个带有 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 } -> 给出错误,因为并非所有哈希都有数字
向这个伟大的社区寻求任何可能帮助我解决此问题的资源或建议。谢谢!
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]
.
之前
我有一个带有 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 } -> 给出错误,因为并非所有哈希都有数字
向这个伟大的社区寻求任何可能帮助我解决此问题的资源或建议。谢谢!
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]
.