【问题标题】:Check if certain value exists in array of hash map检查哈希映射数组中是否存在某个值
【发布时间】:2015-02-16 07:12:31
【问题描述】:

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

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 = [{:sku=>"hello", :value=>"5000"}, {:sku=>"world", :value=>"6000"}, {:sku=>"Hi", :value=>"7000"}]

【问题讨论】:

  • 你能发布一个填充params的例子吗?

标签: ruby-on-rails ruby arrays hashmap


【解决方案1】:

any?include? 方法听起来很符合您的需求。

例子:

params.any? { |param| param.include?(:sku) }

这是一种有效的方法,因为它会“短路”,一旦找到匹配项就会停止。

【讨论】:

  • 使用类似 "params.any? { |p| p.values.member?("hello") }"
【解决方案2】:

因此,您需要收集所有 SKU 的列表。您是否正在寻找关键 sku => 价值?

Hash[*params.map { |p| [p[:sku], p[:value]] }.flatten]

这将为您提供每个 sku 到值的映射,然后您可以使用 sku_hash.key 进行快速键查找?(测试人员)

【讨论】:

    【解决方案3】:

    您可以使用 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
    

    【讨论】:

      猜你喜欢
      • 2018-03-31
      • 2018-05-28
      • 2017-04-28
      • 2011-05-19
      • 1970-01-01
      • 2012-09-03
      • 2019-04-10
      • 1970-01-01
      相关资源
      最近更新 更多