【问题标题】:Iterating through an array to find a hash value遍历数组以找到哈希值
【发布时间】:2015-05-25 22:01:28
【问题描述】:

我有两个数组。一个存储字符串name,一个存储哈希people。我想过滤people 数组并找到与我的名称数组中的一个字符串具有紧密/完全匹配的一个哈希。因此,例如来自 namesJohnJohn Doe 将被视为匹配项,因为两者都包含 John

names = ["John", "Jane"]

people = [{name: "John Doe"}, {name: "Bill Bradley"}]

我尝试使用select 方法匹配两者,但它返回一个空数组?

people.select{|person| person["name"] == names.any?}

【问题讨论】:

    标签: ruby arrays regex hash


    【解决方案1】:

    试试这个:

    matches = people.select do |person|
      !(names & person[:name].split(' ')).empty?
    end
    
    p matches #=> [{:name=>"John Doe"}]
    

    基本上,您首先使用property[:name].split(' ') 将哈希值分成单个单词。其结果将是类似['John', 'Doe'] 的数组。然后,您使用 & 运算符检查这个新创建的数组是否具有名称数组的任何公共元素。因此,您会得到names & property[:name].split(' ')。如果没有产生匹配,您将有一个空数组,这不是您想要的,因此是 !(非)运算符。如果更直观,您也可以这样做:

    matches = people.reject do |person|
      (names & person[:name].split(' ')).empty?
    end
    

    此外,如果您想获取哈希本身而不是包装在数组中的哈希(或哈希,如果有多个结果),请将 select 替换为 detect

    【讨论】:

      【解决方案2】:

      这是一种方式:

      names = ["John", "Jane"]    
      people = [{name: "Johnny Jones"}, {name: "John Doe"}, {name: "Bill Bradley"}]
      
      people.select { |h| hname = h[:name]; names.any? { |n| hname[/\b#{n}\b/i] } }
        #=> [{:name=>"John Doe"}] 
      

      步骤:

      enum = people.select
        #=> #<Enumerator: [{:name=>"Johnny Jones"}, {:name=>"John Doe"},
        #                  {:name=>"Bill Bradley"}]:select>
      

      枚举器的第一个元素传入块中并赋值给块变量h

      h = enum.next
        #=> {:name=>"Johnny Jones"} 
      

      接下来我创建一个临时变量,这样我们就不必为传递到块中的enum 的每个元素检索h[:name]

      hname = h[:name]
        #=> "Johnny Jones"
      

      然后查看names的任何元素是否匹配"Johnny Jones"

      names.any? { |n| hname[/\b#{n}\b/i] }
        #=> ["John", "Jane"].any? { |n| "Johnny Jones"[/\b#{n}\b/i] }
        #=> false
      

      在最后一个表达式中,"John" 被传递到块中并分配给块变量n。然后我们有:

      "Johnny Jones"[/\bJohn\b/i]
        #=> nil
      

      第一个分词 (\b) 要求"John" 前面紧跟一个非单词字符(或者是字符串的第一个字符);第二个分词要求"John" 后面紧跟一个非单词字符(或者是字符串中的最后一个字符)。因此,"John" 不匹配 "Johnny Jones"

      names 的下一个(也是最后一个)元素("Jane" 然后被传递到块中并分配给n"Johnny Jones" 也不匹配"Jane",所以any? 返回@987654345 @ 和可怜的约翰尼没有被选中。

      以类似的方式,John Doe 被选中,Bill Bradley 被送回家。

      【讨论】:

      • 您能解释一下any? 块中的正则表达式代码在做什么吗?
      • 另外,您还缺少一个引号来关闭 Johnny Jones 的字符串
      • 我提供了解释(也注意到了缺少的报价,但谢谢)。
      猜你喜欢
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 2014-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多