散列数组中的Ruby / Replace值

如何用31岁代替年龄?

[{"name"=>"Bob"}, {"age"=>"30"}] 

另一种方法,使用find

 1.9.3p194 :007 > array1 = [{"name"=>"Bob"}, {"age"=>"30"}] => [{"name"=>"Bob"}, {"age"=>"30"}] 1.9.3p194 :008 > hash1 = array1.find { |h| h['age'] == "30" } => {"age"=>"30"} 1.9.3p194 :009 > hash1['age'] = 31 => 31 1.9.3p194 :010 > array1 => [{"name"=>"Bob"}, {"age"=>31}] 

为什么不将数组转换为更容易和更灵活的工作? 你的数组急于成为一个价值对象:

 class Person attr_accessor :name, :age def initialize arr arr.each { |h| h.each { |k,v| instance_variable_set("@#{k}", v) } } end def to_hash_array instance_variables.each_with_object([]) do |iv, arr| arr << {iv.to_s.sub('@','') => instance_variable_get(iv)} end end end def hash_array_to_person arr person = Person.new arr.each { |h| h.each { |k,v| person.send("#{k}=", v) } } person end example = [{"name"=>"Bob"}, {"age"=>"30"}] bob = Person.new(example) p bob p bob.to_hash_array bob.age = 31 p bob.to_hash_array 

输出:

 # [{"name"=>"Bob"}, {"age"=>"30"}] [{"name"=>"Bob"}, {"age"=>31}] 

Ruby不是C,你可以获得比基本原始数据类型更多的东西。

因为你真正拥有的是一个哈希数组,你可以索引数组以获得第二个哈希值,然后通过传递"age"作为键来更新值:

 1.9.3p194 :001 > h = [{"name"=>"Bob"}, {"age"=>"30"}] => [{"name"=>"Bob"}, {"age"=>"30"}] 1.9.3p194 :002 > h[1]["age"] = 31 => 31 1.9.3p194 :003 > h => [{"name"=>"Bob"}, {"age"=>31}] 

这样做:

 [{"name"=>"Bob"}, {"age"=>"30"}][1]["age"] = 31