在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