如何基于数组键对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
相关产品推荐
相关产品推荐

