我需要根据多个参数拆分哈希值,这些参数将是键,并作为哈希数组返回。基本上,我需要一个执行.split()对字符串执行相同工作的方法,但是有多个分隔符 - 哈希有这样的东西吗?
示例:
输入
({ :a=>1, :b=>2, :c=>3, :d=>4, :e=>5, :f=>6 },:c, :e)
输出
[ {:a=>1, :b=>2}, {:c=>3, :d=>4}, {:e=>5, :f=>6} ]
答案 0 :(得分:1)
在元素使用Enumerable#slice_before
之前切片:
{ :a=>1, :b=>2, :c=>3, :d=>4, :e=>5, :f=>6 }.slice_before do |e|
%i[c e].include? e.first
end.map(&:to_h)
通用实施(不带支票):
λ = lambda do |hash, *delimiters|
hash.slice_before do |e|
delimiters.include? e.first
end.map(&:to_h)
end
λ.({ :a=>1, :b=>2, :c=>3, :d=>4, :e=>5, :f=>6 }, :c, :e)
#⇒ [ {:a=>1, :b=>2}, {:c=>3, :d=>4}, {:e=>5, :f=>6} ]
要按相同大小的片段切片哈希,请使用Enumerable#each_slice
:
{ :a=>1, :b=>2, :c=>3, :d=>4, :e=>5, :f=>6 }.each_slice(2).map &:to_h
答案 1 :(得分:-1)
对于纯红宝石(MRI <1.9),不可能完成任务。 ruby Hash在此版本中没有键的顺序。因此,您需要支持密钥顺序的ActiveSupport :: OrderedHash。在MRI版本中,> = 1.9,它可以直接使用
# in case hs is of type ActiveSupport::OrderedHash.new
# ds = delimiters
result = []
result_hash = {}
next_del = delimiters.shift
hs.keys.each do |key|
if next_del == key
result << result_hash
result_hash = {}
next_del = delimiters.shift
end
result_hash[key] = hs[key]
end
result << result_hash
result