我有一系列哈希:
[{:foo => 1, :bar => 2}, {:foo => 2, :bar => 4} ...]
一个整数数组:
[3, 6]
我希望将整数数组和散列中的值组合起来,结果如下:
[{:foo => 1, :bar => 2, :baz => 3}, {:foo => 2, :bar => 4, :baz => 6}]
我目前正在这样做:
myArrayOfHashes.each_with_index |myHash, index|
myHash[:baz] = myArrayOfIntegers[index]
end
这是正确的方法吗?
我想象的是一种更具功能性的方法,我会同时迭代这两个数组,就像使用zip
+ map
一样。
答案 0 :(得分:6)
尝试:
require 'pp'
ary_of_hashes = [{:foo => 1, :bar => 2}, {:foo => 2, :bar => 4}]
[3, 6].zip(ary_of_hashes).each do |i, h|
h[:baz] = i
end
pp ary_of_hashes
结果是:
[{:foo=>1, :bar=>2, :baz=>3}, {:foo=>2, :bar=>4, :baz=>6}]
zip
是一个很好的工具,但是map
并不会真正买得多,至少在这种情况下,each
无法轻易做到。< / p>
此外,不要使用像myArrayOfHashes
这样的CamelCase命名变量,而应使用snake_case,例如ary_of_hashes
。我们使用CamelCase作为类名。 技术上我们可以使用混合大小写的变量,但按照惯例,我们不会这样做。
并且,可以使用each_with_index
,但它会导致代码笨拙,因为它会强制您使用[3, 6]
的索引。让zip
加入两个数组的相应元素,您将拥有按摩哈希所需的一切。
答案 1 :(得分:6)
map
非常有用:
a = [{:foo => 1, :bar => 2}, {:foo => 2, :bar => 4}]
b = [3,6]
a.zip(b).map { |h, i| h.merge(baz: i) }
# => [{:foo=>1, :bar=>2, :baz=>3}, {:foo=>2, :bar=>4, :baz=>6}]
a.inspect
# => [{:foo=>1, :bar=>2}, {:foo=>2, :bar=>4}]
答案 2 :(得分:3)
array_of_hashes.each { |hash| hash.update baz: array_of_integers.shift }