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

时间:2018-07-11 13:20:54

标签: ruby

在数组中查找特定散列并就地替换其值,从而使数组也发生变化的最有效方法是什么?

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

1 个答案:

答案 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"

希望有帮助-让我知道您的工作方式或是否有任何疑问。