繁体   English   中英

在哈希对象数组中添加元素

[英]Add element in the array of hash object

像这样的哈希数组的哈希

{'1' => [{'a' => 'ss', 'b' => 'tt'},
         {'a' => 'sdd', 'b' => 'tdd'}],
 '2' => [{'a' => 'ffff', 'b' => 'sds'}],
 '3' => [{'a' => 'ddd', 'b' => 'ssss'},
         {'a' => 'sss', 'b' => 'sssss'}]}

我想在数组的每个哈希中添加'c' => 'xyz'

{'1' => [{'a' => 'ss', 'b' => 'tt', 'c' => 'xyz'},
         {'a' => 'sdd', 'b' => 'tdd', 'c' => 'xyz'}],
 '2' => [{'a' => 'ffff', 'b' => 'sds', 'c' => 'xyz'}],
 '3' => [{'a' => 'ddd', 'b' => 'ssss', 'c' => 'xyz'},
         {'a' => 'sss', 'b' => 'sssss', 'c' => 'xyz'}]}

我该如何实施?

my_arrays = {'1' => [{'a' => 'ss', 'b' => 'tt'},
                     {'a' => 'sdd', 'b' => 'tdd'}],
             '2' => [{'a' => 'ffff', 'b' => 'sds'}],
             '3' => [{'a' => 'ddd', 'b' => 'ssss'},
                     {'a' => 'sss', 'b' => 'sssss'}]}

my_arrays.each do |key, value|
  value.each do |val|
    val.store('c', 'xyz')
  end
end
h = {'1' => [{'a' => 'ss', 'b' => 'tt'},
             {'a' => 'sdd', 'b' => 'tdd'}],
     '2' => [{'a' => 'ffff', 'b' => 'sds'}],
     '3' => [{'a' => 'ddd', 'b' => 'ssss'},
             {'a' => 'sss', 'b' => 'sssss'}]}

h.values.each do |ary|
  ary.each do |inner_hash|
    inner_hash['c'] = 'xyz'
  end
end

上面的解决方案与marmeladze的答案非常相似,所以让我来解释一下区别:

  • 我们不需要对外部哈希的键做任何事情。 因此,我们可以直接使用外部哈希的值进行迭代,而完全不关心键。
  • inner_hash['c'] = 'xyz'使用元素分配语法而不是调用#store 他们做的完全一样

在对marmeladze的回答的评论中,您询问:

我们可以通过迭代一次而不是每个循环2次来实现这一点吗?

h.values给我们一个数组数组。 (因为它给出的值的数组h和的值h是数组)。我们可以折叠嵌套阵列, flatten ,因此只能与一个显式迭代获得相同的结果:

h.values.flatten.each do |inner_hash|
  inner_hash['c'] = 'xyz'
end

或者,(等效地)如果您更喜欢一行

h.values.flatten.each { |ih| ih['c'] = 'xyz' }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM