You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby中如何依据指定group_pm_list规则对嵌套哈希二维数组重排序

Ruby 按指定规则重排数组实现方案

实现思路

利用Ruby内置的sort_by方法,通过两个维度的排序权重实现需求:

  1. 第一优先级:按照group_pm_list的键顺序对:focus值排序
  2. 第二优先级:同一: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:06:03