哈希

时间:2016-08-10 15:08:32

标签: ruby hash

我需要根据多个参数拆分哈希值,这些参数将是键,并作为哈希数组返回。基本上,我需要一个执行.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} ]

2 个答案:

答案 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