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

Ruby中如何将值为数组的哈希转换为数组元素为键、原键数组为值的哈希

Ruby 哈希按值反向映射实现方案

核心实现代码

针对给出的转换规则,最符合Ruby编码习惯、性能与可读性平衡的实现如下:

# 原始哈希
original = { 1 => [], 2 => ["A", "B"], 3 => ["C"], 4 => ["B", "C"], 5 => ["D"] }

converted = original.each_with_object(Hash.new { |hash, key| hash[key] = [] }) do |(origin_key, origin_vals), res|
  if origin_vals.empty?
    res["default"] << origin_key
  else
    origin_vals.each { |val| res[val] << origin_key }
  end
end

执行后得到的结果完全匹配预期:

p converted
# 输出: {"A"=>[2], "B"=>[2, 4], "C"=>[3, 4], "D"=>[5], "default"=>[1]}

实现说明

  • 用Hash.new { |h,k| h[k] = [] }初始化结果哈希,访问不存在的键时会自动创建对应空数组,省去手动判断键是否存在、初始化空数组的冗余代码
  • 仅遍历一次原始哈希,时间复杂度为O(n)(n为原始哈希所有值数组的元素总个数),没有多余的中间对象生成,性能最优
  • 逻辑分支直接对应转换规则:原始值为空数组时,将原始键归入default数组;非空时遍历值数组的每个元素,把原始键追加到对应新键的数组中

可选调整

如果需要强制让default键固定在结果哈希的末尾(不受原始哈希中空数组键的位置影响),可以在转换完成后追加一行处理:

converted["default"] = converted.delete("default") if converted.key?("default")

这行代码会先取出已生成的default值,删除原有位置的键值对后重新追加到哈希末尾。

内容的提问来源于stack exchange,提问作者akjain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 12:45:27