Ruby中如何依据指定group_pm_list规则对嵌套哈希二维数组重排序
Ruby 按指定规则重排数组实现方案
实现思路
利用Ruby内置的sort_by方法,通过两个维度的排序权重实现需求:
- 第一优先级:按照
group_pm_list的键顺序对:focus值排序 - 第二优先级:同一
:focus分组内,按照对应键值数组的顺序对:pm值排序
完整实现代码
# 原始数据 product = [[{:pm=>61, :scs=>20, :focus=>8}, {:pm=>61, :scs=>23, :focus=>8}], [{:pm=>65, :scs=>20, :focus=>8}, {:pm=>65, :scs=>23, :focus=>8}], [{:pm=>59, :scs=>20, :focus=>1}, {:pm=>59, :scs=>23, :focus=>1}], [{:pm=>60, :scs=>20, :focus=>1}, {:pm=>60, :scs=>23, :focus=>1}], [{:pm=>70, :scs=>20, :focus=>10}, {:pm=>70, :scs=>25, :focus=>10}], [{:pm=>85, :scs=>60, :focus=>10}, {:pm=>85, :scs=>25, :focus=>10}], [{:pm=>72, :scs=>20, :focus=>10}, {:pm=>72, :scs=>25, :focus=>10}]] # 排序规则哈希 group_pm_list={"8"=>[65,61],"1"=>[60,59],"10"=>[70,85,72]} # 排序逻辑 sorted_product = product.sort_by do |item| # 提取当前子数组的focus值,转为字符串匹配group_pm_list的键 focus_key = item.first[:focus].to_s # 第一排序权重:focus的顺序 weight1 = group_pm_list.keys.index(focus_key) # 第二排序权重:同focus下pm的顺序 weight2 = group_pm_list[focus_key].index(item.first[:pm]) [weight1, weight2] end # 打印验证结果 pp sorted_product
运行结果
执行上述代码后输出的sorted_product与你给出的预期结果完全一致。
补充说明
如果存在group_pm_list中未定义的:focus或:pm值,可以补充兜底逻辑,将未匹配项统一排到列表末尾:
sorted_product = product.sort_by do |item| focus_key = item.first[:focus].to_s weight1 = group_pm_list.keys.index(focus_key) || Float::INFINITY weight2 = group_pm_list.dig(focus_key)&.index(item.first[:pm]) || Float::INFINITY [weight1, weight2] end
内容的提问来源于stack exchange,提问作者jissy
相关产品推荐
相关产品推荐

