【问题标题】:How do I check if my hash has a key from an array of strings?如何检查我的哈希是否具有来自字符串数组的键?
【发布时间】:2017-12-22 21:21:19
【问题描述】:

对于 Ruby,如果我有一个哈希,那么检查它是否有来自字符串数组的键的最快方法是什么?所以我可以这样做

has_key = false
arr_of_strings.each do |str|
    if my_hash.has_key?(str)
        has_key = true
        break
    end
end

但是对于这样一个简单的查询来说,代码行似乎太多了。

【问题讨论】:

    标签: ruby-on-rails arrays ruby hash


    【解决方案1】:

    就这么简单:

    arr_of_strings.any? {|s| my_hash.key?(s) }
    

    或者,为了获得聪明但不可读的代码的奖励积分:

    arr_of_strings.any?(&my_hash.method(:key?)) # => true
    

    【讨论】:

      【解决方案2】:

      要查看数组和键是否有共同点,可以使用 set intersection:

      (arr & hash.keys).any?
      

      【讨论】:

      • 也许值得一提的是,这在这种情况下有效,因为数组是字符串数组,但不适用于 arr = [false] 和 hash = {false => true}。
      • 谁会这样做? :)
      【解决方案3】:
      strings = ['a', 'b', 'c']
      hash = {:a => 'apple', :b => 'bob', :d => 'thing'}
      
      has_key = hash.keys.map(&:to_s) & strings  # ['a', 'b']
      has_key.any? # true
      

      类似的单线,hash.keys.detect { |key| strings.include?(key.to_s) }.nil?

      【讨论】:

      • Natalia,JFYI,这不是 最快 方式(据说你想要的)。 :)
      • @SergioTulentsev 我更担心.map(&:to_s) 使这个不正确。甚至 Josh 自己的例子也被 Natalia 的代码判断不同......
      • @StefanPochmann 符号与字符串的辩论也让我筋疲力尽:(
      • @StefanPochmann:不,并非总是如此。当在哈希中没有找到键时,它返回 true。
      • @SergioTulentsev 哦,对了。 Ruby 总是用它的别名和奇怪的名字让我感到困惑。但是那个单行仍然是错误的,结果应该被否定(我猜除非结果被否定是可以的)。
      猜你喜欢
      • 2019-08-08
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      相关资源
      最近更新 更多