在Ruby中的嵌套哈希中插入新的键值

在Ruby中的嵌套哈希中插入新的键值,ruby,Ruby,我正在尝试将一个新的键/值{type:'Profile'}插入到id=111的照片散列中 photo_hash = [{"id": "111","photo": "http://photo.com/111.jpeg"}, {"id": "222", "photo": "http://photo.com/222.jpeg"}] 因此,最终结果应该如下所示: photo_hash = [{"id": "111","photo": "http://photo.com/111.jpeg", "ty

我正在尝试将一个新的键/值
{type:'Profile'}
插入到id=111的照片散列中

photo_hash = [{"id": "111","photo": "http://photo.com/111.jpeg"}, {"id": "222",  "photo": "http://photo.com/222.jpeg"}] 
因此,最终结果应该如下所示:

photo_hash = [{"id": "111","photo": "http://photo.com/111.jpeg", "type" : "Profile"}, {"id": "222",  "photo": "http://photo.com/222.jpeg"}] 

我觉得这在Ruby中应该是非常简单的,但我非常困惑

您需要从现有阵列构建一个新阵列:

photos = [{"id": "111","photo": "http://photo.com/111.jpeg"}, {"id": "222",  "photo": "http://photo.com/222.jpeg"}]

new_photos = photos.map do |photo|
  if photo[:id] == '111'
    photo.merge(type: 'Profile')
  else
    photo
  end
end

这个问题向我建议,通过添加键值对
:type=>“Profile”
来修改
photos
h[:id]=“111
(如果有)的元素
h
(散列)


请参阅(又名
合并!
)。

您不需要查找对象或创建新的
数组。
散列
它自身就是它的对象,并且可以更新

photos = [{"id": "111","photo": "http://photo.com/111.jpeg"}, {"id": "222",  "photo": "http://photo.com/222.jpeg"}]
photos.each do |hsh|
  if hsh[:id] == '111'
    hsh[:type] = 'Profile'
    break
  end
end
photos
# => [{:id=>"111", :photo=>"http://photo.com/111.jpeg", :type=>"Profile"}, {:id=>"222", :photo=>"http://photo.com/222.jpeg"}]

如果需要从具有不同ID的不同对象更新多个值,还可以构建查找树(假设没有重复ID)

然后简单地获取照片并更新值

photo = photo_lookup["111"] and photo.update(type: 'Profile')
#                            ^ only update photo if it is found

这个解决方案改变了散列,这意味着照片中的散列也应该更新。

这不是一个嵌套的散列。它是一个散列数组。
(“type”:“Profile”)
不是有效的Ruby语法。顺便说一句,散列键周围的引号是多余的,并且非常容易误导–它使键看起来像字符串。但是
“id”“:
实际上只是
id:
,即一个符号。如果你想要字符串键,你需要执行
“id”=>“111”
。你也可以使用另一种语法
h=photos.find{124; h | h[:id]=“111”}和h.update(insert_item)
,在这种情况下也是这样做的。
photos = [{"id": "111","photo": "http://photo.com/111.jpeg"}, {"id": "222",  "photo": "http://photo.com/222.jpeg"}]
photos.each do |hsh|
  if hsh[:id] == '111'
    hsh[:type] = 'Profile'
    break
  end
end
photos
# => [{:id=>"111", :photo=>"http://photo.com/111.jpeg", :type=>"Profile"}, {:id=>"222", :photo=>"http://photo.com/222.jpeg"}]
photos = [{"id": "111","photo": "http://photo.com/111.jpeg"}, {"id": "222",  "photo": "http://photo.com/222.jpeg"}]
photo_lookup = photos.map { |photo| [photo[:id], photo] }.to_h
#=> { 
#   "111" => {"id": "111","photo": "http://photo.com/111.jpeg"},
#   "222" => {"id": "222",  "photo": "http://photo.com/222.jpeg"}
# }
photo = photo_lookup["111"] and photo.update(type: 'Profile')
#                            ^ only update photo if it is found