我有一系列哈希值,我不想修改每个哈希值。所以我在迭代我的源数据 - 在这个例子中只是迭代数字,我修改每个哈希。 但是在迭代器的上下文之外,只修改了数组的一个元素而不是所有元素,并且数组的第一个元素被最后一个元素覆盖。
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"}
答案 0 :(得分:2)
使用map
或each
:
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"}]