将值添加到现有(哈希)键,而不覆盖现有值?

时间:2012-03-15 12:45:59

标签: ruby arrays hash

简化版:

ar=['name: Joe', 'name: Jack', 'name: Jill']

hash={}

ar.each{|line| if line.include?('name'); hash['name'] = line;end;}

puts hash

我的目标是将数组中的所有元素添加到' name' -key中,但我的代码似乎覆盖了现有的值。

是否可以将多个值分配给一个单独的键?我宁愿不使用数组作为值。

编辑:

我意识到我的第一个例子确实涵盖了整个问题:

将数组扩展为:     ar = ['名称:Joe','名称:Jack','名称:Jill',年龄:29'年龄:32& #39;,' misc:天气很好']

我的目的是将名称分组在名称'等等下面。

事先不知道属性/键的数量,因此数组将以动态方式生成。

1 个答案:

答案 0 :(得分:3)

除了使用数组作为值之外别无选择。否则你将如何检索多个值?无论如何,你需要某种可枚举,所以使用数组没有问题。

尝试这样的事情:

hash = {}
ar = ['name: Joe', 'name: Jack', 'name: Jill']

hash['name'] = ar.select {|l| l.include? 'name'}.collect {|l| l.split.last}

hash # => {"name"=>["Joe", "Jack", "Jill"]}

或者,更简单一点:

hash = {"name" => ar.select {|l| l.include? 'name'}.collect {|l| l.split.last} }

对于您编辑过的问题:

hash = Hash.new {|h,k| h[k] = [] }
ar.each {|l| k,v = l.split(": "); hash[k] << v }
hash # => {"name"=>["Joe", "Jack", "Jill"], "foo"=>["bar"]}