查找并替换特定哈希及其在数组中的值
在数组中查找特定哈希并在适当位置替换其值的最有效方法是什么,因此数组也会更改?
到目前为止我已经有了这个代码,但是在一个包含大量数据的实际应用程序中,这成为应用程序中最慢的部分,可能会泄漏内存,因为当我在每个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"
希望有所帮助 – 让我知道你如何继续它或如果你有任何问题。
- 如何从rails中的嵌套资源进行路由? 在UsersController#show中获取’ActiveRecord :: RecordNotFound’
- Ruby-on-rails 4性能下降
- Rails 2.3.5应用程序在Ruby 1.8.7 Rake错误。
- 是否可以在Ruby中为模块创建别名?
- OptionParser返回bool而不是参数?
- Ruby将不可打印的字符转换为数字
- Rails 5 db migration:如何修复ActiveRecord :: ConcurrentMigrationError
- /usr/local/lib/libz.1.dylib,文件是为i386构建的,它不是被链接的体系结构(x86_64)
- 如何设置Commander gem default命令?