我有一个哈希映射数组。它看起来像这样:
params = []
CSV.foreach(......) do
one_line_item = {}
one_line_item[:sku] = "Hello"
one_line_item[:value] = "20000"
params << one_line_item
end
我想检查:sku
是否在此哈希数组中。我是这样做的:
# Reading new line of csv in a hash and saving it in a temporary variable (Say Y)
params.each do |p|
if p[:sku] == Y[:sku]
next
end
end
我正在遍历每个sku值的完整列表,因此时间复杂度是为了折腾[O(n ^ 2)],更不用说它没用了。
我可以使用include?
吗?
如果我可以一次性从整个数组中获得与键:sku
对应的值数组,那么它将解决我的问题。 (我知道我可以为这些值维护另一个数组,但我想避免这种情况)
params的一个例子
params = [{:sku=>"hello", :value=>"5000"}, {:sku=>"world", :value=>"6000"}, {:sku=>"Hi", :value=>"7000"}]
答案 0 :(得分:2)
示例:
params.any? { |param| param.include?(:sku) }
这是一种有效的方法,因为它“短路”,一旦找到匹配就会停止。
答案 1 :(得分:0)
所以你想要的是收集所有SKU的清单。您是否希望关键sku =&gt;值?
Hash[*params.map { |p| [p[:sku], p[:value]] }.flatten]
这将为您提供每个sku到该值的映射,然后您可以使用sku_hash.key进行快速键查找?(测试人员)
答案 2 :(得分:0)
你可以使用 rails_param gem来做同样的事情。我发现它对于控制器中的验证请求参数非常有用:
https://github.com/nicolasblanco/rails_param
# primitive datatype syntax
param! :integer_array, Array do |array,index|
array.param! index, Integer, required: true
end
# complex array
param! :books_array, Array, required: true do |b|
b.param! :title, String, blank: false
b.param! :author, Hash, required: true do |a|
a.param! :first_name, String
a.param! :last_name, String, required: true
end
b.param! :subjects, Array do |s,i|
s.param! i, String, blank: false
end
end