5

How do I replace age with 31?

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

5 に答える 5

8

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}]
于 2012-11-16T17:29:11.163 に答える
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 ではありません。基本的なプリミティブ データ型よりもはるかに多くの機能を利用できます。

于 2012-11-16T17:59:13.680 に答える
2

実際に持っているのはハッシュの配列であるため、配列にインデックスを付けて 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}] 
于 2012-11-16T17:24:34.313 に答える
1

これは次のようになります。

[{"name"=>"Bob"}, {"age"=>"30"}][1]["age"] = 31
于 2012-11-16T17:24:44.507 に答える