4

我有一个哈希数组:

[{: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

4

3 回答 3

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在这种情况下你不能轻易做到。

此外,不要使用 CamelCase 命名变量myArrayOfHashes,而是使用蛇形大小写,例如ary_of_hashes. 我们使用 CamelCase 作为类名。从技术上讲,我们可以对变量使用大小写混合,但按照惯例,我们不这样做。

而且,可以each_with_index使用[3, 6]. 让我们zip加入两个数组的各自元素,您将拥有按摩散列所需的一切。

于 2013-06-21T07:07:10.350 回答
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}]
于 2013-06-21T07:08:42.677 回答
3
array_of_hashes.each { |hash| hash.update baz: array_of_integers.shift }
于 2013-06-21T07:24:53.060 回答