在迭代器中修改哈希数组只会修改最后一项

时间:2016-05-19 19:58:32

标签: arrays ruby hash

我有一系列哈希值,我不想修改每个哈希值。所以我在迭代我的源数据 - 在这个例子中只是迭代数字,我修改每个哈希。 但是在迭代器的上下文之外,只修改了数组的一个元素而不是所有元素,并且数组的第一个元素被最后一个元素覆盖。

arr = [{ id: 1 }, { id: 2 }, { id: 3 }]

1.upto(3) do |i|
  a = arr.detect { |t| t[:id] = i }
  a[:content] = 'this is my content'
end

puts arr

输出

{:id=>3, :content=>"this is my content"}
{:id=>2}
{:id=>3}

预期输出

{:id=>1, :content=>"this is my content"}
{:id=>2, :content=>"this is my content"}
{:id=>3, :content=>"this is my content"}

2 个答案:

答案 0 :(得分:2)

使用mapeach

arr = [{ id: 1 }, { id: 2 }, { id: 3 }]
arr.map { |e| e.merge(content: 'this is my content')}
=> [{:id=>1, :content=>"this is my content"}, 
    {:id=>2, :content=>"this is my content"}, 
    {:id=>3, :content=>"this is my content"}]

或者您可以在代码中将==替换为=

a = arr.detect { |t| t[:id] == i }

== - 平等,= - 作业

答案 1 :(得分:0)

如果您想修改arr的元素,可以写:

arr = [{ id: 1 }, { id: 2 }, { id: 3 }]

arr.map { |h| h.tap { |g| g[:content] = "this is my content" } }
  # => [{:id=>1, :content=>"this is my content"},
  #     {:id=>2, :content=>"this is my content"},
  #     {:id=>3, :content=>"this is my content"}]