将键值对添加到散列数组中的所有散列

时间:2015-08-17 19:10:49

标签: 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

也许问题有点愚蠢,但只是认为应该有类似ActiveRecord风格的东西

results.update_all(C:" NEW_VALUE&#34)

比迭代更有效/更快 ......可能是因为阵列没有区别......

之间的区别
array.map{|a| [a,2]}

array.product([2])

3 个答案:

答案 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"}