检查哈希映射数组中是否存在某个值

时间:2015-02-16 07:12:31

标签: ruby-on-rails ruby arrays hashmap

我有一个哈希映射数组。它看起来像这样:

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"}]

3 个答案:

答案 0 :(得分:2)

any?include?方法听起来就像您需要的那样。

示例:

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