Ruby 将键值对添加到哈希数组中的所有哈希

Ruby 将键值对添加到哈希数组中的所有哈希,ruby,Ruby,我有一个哈希数组 results = [{a:1, b:2},{a:3, b:4}] 我想在所有散列中添加一个元素“c”,这样我就可以得到: results = [{a:1, b:2, c:"newvalue"},{a:3, b:4, c:"newvalue"}] 我正在尝试一种更有效的方法来完成这个任务,而不是在数组中循环并逐个完成 应该澄清。我所说的“不迭代”只是指不写作 results.each do |a| a[:c] = "newvalue" end 也许这个问题有点傻,但我

我有一个哈希数组

results = [{a:1, b:2},{a:3, b:4}]
我想在所有散列中添加一个元素“c”,这样我就可以得到:

results = [{a:1, b:2, c:"newvalue"},{a:3, b:4, c:"newvalue"}]
我正在尝试一种更有效的方法来完成这个任务,而不是在数组中循环并逐个完成

应该澄清。我所说的“不迭代”只是指不写作

results.each do |a|
  a[:c] = "newvalue"
end
也许这个问题有点傻,但我只是在想应该有类似ActiveRecord风格的东西

结果。全部更新(c:“新值”)

这比迭代更有效/更快 ... 这可能是因为数组没有区别

或者两者之间的区别

array.map{|a| [a,2]}

试试这个

results.each {|h| h[:c]="newvalue" unless h.include? :c}
如果不存在,它将添加:c值

如果要添加所有元素而不选中它

results.each {|h| h[:c]="newvalue"}
如果不需要迭代,可以在请求值时请求执行fetch方法

results.fetch(:c, "newvalue")
如果您在散列中需要该值,并且不需要迭代数组,那么可以在使用(默认值)

给定值创建散列时添加默认值

results = [{a:1, b:2},{a:3, b:4}]
然后

'newvalue'
不是静态的时

merge_in = ['newvalue1', 'newvalue2']
然后


我无法估计@Cary Swoveland会对我的答案提出什么样的批评,但让我试试:)

您有一个哈希数组。对于我的ruby版本(1.8.7),我对它做了一些修改

irb(main):003:0> results = [{'a'=>1, 'b'=>2},{'a'=>3, 'b'=>4}]
要向这些数组元素中的每个元素添加新的键值对,必须对它们进行迭代

在ruby中有很多方法可以做到这一点,但其中一种方法可以让您正确理解这个主题

irb(main):007:0> results.each do |h| # get each element (key-value pairs) of results array  
irb(main):008:1* h['c'] = 'newvalue' #add a new pair to them
irb(main):009:1> end
=> [{"c"=>"newvalue", "b"=>2, "a"=>1}, {"c"=>"newvalue", "b"=>4, "a"=>3}]
# same as results.each {|h| h['c'] ="newvalue"}

无论如何,您必须在数组中循环以修改每个哈希。您的意思是不希望直接使用迭代器吗?如果是这样,为什么会“更有效率”?只是一个练习(这可以吗?“更有效”为什么?@kris,我引用了OP.Cary-对不起,我没有看到你的评论,我问的问题和你一样:)我想不出一个避免迭代的方法,但这里有一个非常复杂的过程:)
results.product([[[:c,5]]]){p | p.first.merge!(p.pop.to-h)}
主要针对@CarySwoveland,他喜欢用奇怪的方式解决问题。OP不想“在数组中循环”。我看不出这是可能的:)这个答案对我非常有帮助。我遇到了与OP类似的问题,并且已经尝试使用
map
,但没有意识到需要添加
;v
结尾的部分。我一直只得到返回的单个散列键值,而不是整个散列。非常感谢。如果
:c
已经是一个键,OP没有提到避免替换
:c
的值。在前面的一个答案中,最后一行是verbatem,可能是因为OP不想“循环遍历数组”。好的,所以在使用该值时,可以使用fetch方法进行哈希。结果[0]。获取(:c,“newvalue”)。如果不存在,则将返回默认值。使用
(或
有_键?
)而不是
包含?
)可能更具描述性。这与我认为是一样,
包含?
键相同
有_键?
results.map.with_index { |hash, i| hash['c'] = merge_in[i]; hash }
# => [{:a=>1, :b=>2, "c"=>"newvalue1"}, {:a=>3, :b=>4, "c"=>"newvalue2"}]
irb(main):003:0> results = [{'a'=>1, 'b'=>2},{'a'=>3, 'b'=>4}]
irb(main):007:0> results.each do |h| # get each element (key-value pairs) of results array  
irb(main):008:1* h['c'] = 'newvalue' #add a new pair to them
irb(main):009:1> end
=> [{"c"=>"newvalue", "b"=>2, "a"=>1}, {"c"=>"newvalue", "b"=>4, "a"=>3}]
# same as results.each {|h| h['c'] ="newvalue"}