查找并替换特定哈希及其在数组中的值

在数组中查找特定哈希并在适当位置替换其值的最有效方法是什么,因此数组也会更改?

到目前为止我已经有了这个代码,但是在一个包含大量数据的实际应用程序中,这成为应用程序中最慢的部分,可能会泄漏内存,因为当我在每个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"}}] 

这将只执行一次循环记录之后的操作:

 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" 

希望有所帮助 – 让我知道你如何继续它或如果你有任何问题。