在数组中查找特定散列并就地替换其值,从而使数组也发生变化的最有效方法是什么?
到目前为止,我已经获得了这段代码,但是在一个有大量数据的真实应用程序中,这成为应用程序中最慢的部分,可能会泄漏内存,因为当我在每个websocket上执行此操作时,无界内存会不断增长消息。
array =
[
{ id: 1,
parameters: {
omg: "lol"
},
options: {
lol: "omg"
}
},
{ id: 2,
parameters: {
omg: "double lol"
},
options: {
lol: "double omg"
}
}
]
selection = array.select { |a| a[:id] == 1 }[0]
selection[:parameters][:omg] = "triple omg"
p array
# => [{:id=>1, :parameters=>{:omg=>"triple omg"}, :options=>{:lol=>"omg"}}, {:id=>2, :parameters=>{:omg=>"double lol"}, :options=>{:lol=>"double omg"}}]
答案 0 :(得分:3)
这将使您只浏览一次记录即可:
array.each { |hash| hash[:parameters][:omg] = "triple omg" if hash[:id] == 1 }
您始终可以扩展该块以处理其他条件:
array.each do |hash|
hash[:parameters][:omg] = "triple omg" if hash[:id] == 1
hash[:parameters][:omg] = "quadruple omg" if hash[:id] == 2
# etc
end
并且它将仅一次迭代元素。
也可能是您更适合将数据调整为单个哈希。一般来说,搜索散列比使用数组要快,特别是如果您具有唯一的标识符(如此处)。像这样:
{
1 => {
parameters: {
omg: "lol"
},
options: {
lol: "omg"
}
},
2 => {
parameters: {
omg: "double lol"
},
options: {
lol: "double omg"
}
}
}
这样,您可以调用以下代码来实现自己的目标:
hash[1][:parameters][:omg] = "triple omg"
希望有帮助-让我知道您的工作方式或是否有任何疑问。