我有一个哈希数组。
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风格的东西
results.update_all(C:" NEW_VALUE&#34)
比迭代更有效/更快 ......可能是因为阵列没有区别......
或
之间的区别array.map{|a| [a,2]}
和
array.product([2])
答案 0 :(得分:6)
试试这个。
results.each {|h| h[:c]="newvalue" unless h.include? :c}
它会添加:c值,如果不存在。
如果你想为所有元素添加而不检查它。
results.each {|h| h[:c]="newvalue"}
如果你不进行迭代,你可以在询问值时询问fetch方法。
results.fetch(:c, "newvalue")
并且如果您需要哈希值并且不会迭代数组,则可以在使用(默认)创建哈希值时添加默认值
答案 1 :(得分:3)
鉴于
results = [{a:1, b:2},{a:3, b:4}]
然后
results.map { |v| v['c'] = 'newvalue'; v }
# => [{:a=>1, :b=>2, "c"=>"newvalue"}, {:a=>3, :b=>4, "c"=>"newvalue"}]
当'newvalue'
不是静态
merge_in = ['newvalue1', 'newvalue2']
然后
results.map.with_index { |hash, i| hash['c'] = merge_in[i]; hash }
# => [{:a=>1, :b=>2, "c"=>"newvalue1"}, {:a=>3, :b=>4, "c"=>"newvalue2"}]
答案 2 :(得分:0)
我无法估计@Cary Swoveland对我的回答会有什么批评,但让我试试:))
你有一系列哈希。对于我的ruby版本(1.8.7)我修改了一下。
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"}