Ruby / 替换哈希数组中的值

5

我如何将年龄替换为31岁?

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

1
如果Bob是30岁,属性应该在_same_哈希中,因为它们代表同一个人:[{"name"=>"Bob", "age"=>"30"}] - PJSCopeland
5个回答

10

另一种方法是使用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}]

8

使用map!(将替换包含年龄值的所有哈希中的值)

a = [{"name"=>"Bob"}, {"age"=>"30"}]
a.map! do |h|
  h['age'] = 31 if h['age']
  h
end
a
=> [{"name"=>"Bob"}, {"age"=>31}]

3

为什么不将数组转换成更易于处理的、更灵活的数据类型呢?你的数组渴望成为一个值对象:

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

输出:

#<Person:0x00000000fe8418 @name="Bob", @age="30">
[{"name"=>"Bob"}, {"age"=>"30"}]
[{"name"=>"Bob"}, {"age"=>31}]

Ruby不是C语言,你可以使用比基本原始数据类型更多的功能。


2

由于您实际上拥有的是哈希数组,因此可以索引该数组以获取第二个哈希值,然后通过将 "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}] 

1

这个可以:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接