从散列中的每个键返回前x个值

时间:2014-05-07 12:22:35

标签: ruby hash

在下面的哈希中,我想从每个键返回第一个'x'值:

my_hash = {
  :key_one =>["one", "two", "three", "four", "five"], 
  :key_two =>["one", "two", "three", "four", "five"]
} 

不改变散列的结构,即键保持不变。 'x'为2时的预期输出:

my_hash = {
  :key_one => ["one", "two"], 
  :key_two => ["one", "two"]
} 

问题是如何“很好”地做到这一点 - 我可以创建一个新的哈希,但这很麻烦,很难看,即使密钥的数量没有增长,他们可能会这样做。

{
  :key_one => my_hash[:key_one].first(2),
  :key_two => my_hash[:key_two].first(2)
}

4 个答案:

答案 0 :(得分:8)

my_hash = {
  :key_one =>["one", "two", "three", "four", "five"], 
  :key_two =>["one", "two", "three", "four", "five"]
}

Hash[ my_hash.map { |k,v| [ k, v.first(2) ] } ]

# => {:key_one=>["one", "two"], :key_two=>["one", "two"]}

参考文献:

  • Hash[]构造函数
  • Hash是一个Enumerable,因此可以访问Enumerable#map,并遍历[key,value]对。

答案 1 :(得分:4)

使用Array#take的另一种方式:

my_hash = {
  :key_one =>["one", "two", "three", "four", "five"], 
  :key_two =>["one", "two", "three", "four", "five"]
}

my_hash.map { |k,v| [ k, v.take(2) ] }.to_h
# => {:key_one=>["one", "two"], :key_two=>["one", "two"]}

答案 2 :(得分:2)

还有countrybooting:

Hash[ my_hash.map {|key, val| key, val[0...x] } ]

其中x是您想要的值的数量;)

答案 3 :(得分:1)

你走了:

my_hash
# => {:key_one=>["one", "two", "three", "four", "five"],
# :key_two=>["one", "two", "three", "four", "five"]}
my_hash.map {|k,v| [k, v.first(2)]}.to_h
# => {:key_one=>["one", "two"], :key_two=>["one", "two"]}