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

如何基于数组键对Ruby哈希的键进行排序?

Ruby哈希按指定键数组排序,剩余键保留原顺序后置

示例数据

原哈希:

h1 = {
  a1: :a2,
  b1: :b2,
  c1: :c2,
  d1: :d2,
  e1: :e2,
  f1: :f2
}

指定排序的键数组:

key_order = [:b1, :d1, :f1]

预期结果

{
  b1: :b2,
  d1: :d2,
  f1: :f2,
  a1: :a2,
  c1: :c2,
  e1: :e2
}

解决方案

利用Ruby 1.9+版本哈希保留插入顺序的特性,分两步构建目标哈希即可满足需求:

写法一:分步实现

# 按指定数组顺序提取对应键值对
ordered_part = key_order.each_with_object({}) do |key, hash|
  hash[key] = h1[key] if h1.key?(key)
end

# 提取原哈希中不在指定数组的键值对(保留原顺序)
remaining_part = h1.reject { |key, _| key_order.include?(key) }

# 合并两部分得到结果
result = ordered_part.merge(remaining_part)

写法二:简洁链式调用

result = key_order.select { |k| h1.key?(k) }
                  .to_h { |k| [k, h1[k]] }
                  .merge(h1.except(*key_order))

说明

  • key_order.select { |k| h1.key?(k) }用于过滤掉数组中不存在于原哈希的无效键,避免报错
  • h1.except(*key_order)会返回原哈希排除指定键后的剩余键值对,且严格保留原哈希的键顺序
  • merge方法会将后一个哈希的内容追加到前一个哈希末尾,正好符合"指定键在前,剩余键按原顺序在后"的要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:40:09