在数组中查找特定哈希并就地替换其值的最有效方法是什么,以便数组也发生更改?
到目前为止,我已经得到了这段代码,但在具有大量数据的实际应用程序中,这成为应用程序中最慢的部分,这可能会泄漏内存,因为当我对每个 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"
希望这会有所帮助 - 如果您有任何疑问,请告诉我您的进展情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)