如何将数组值与哈希数组合?

时间:2013-06-21 06:54:43

标签: ruby

我有一系列哈希:

[{: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一样。

3 个答案:

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