2017-03-17 67 views
0

我有一个充满了一堆哈希的巨大数组。我需要做的是从数组中选出一个满足特定条件的索引散列。 (这样做是由于一个RSpec测试,但有麻烦挑选出其中之一)在符合特定条件的数组中抓取特定的哈希

我的阵列是这样

[ 
    { 
         "name" => "jon doe", 
        "team" => "team2", 
        "price" => 2000, 
     "eligibility_settings" => {} 
    }, 
    { 
         "name" => "jonny doe", 
        "team" => "team1", 
        "value" => 2000, 
     "eligibility_settings" => { 
        "player_gender" => male, 
        "player_max_age" => 26, 
        "player_min_age" => 23, 
      "established_union_only" => true 
     } 
    }, 
    { 
         "name" => "jonni doe", 
        "team" => "team3", 
        "price" => 2000, 
     "eligibility_settings" => {} 
    }, 
] 

我需要挑出基于其资格设置第二个。我从我的数组中取了三个,还有很多,像(hash.second)这样简单的活动记录方法在这个例子中不起作用。

我已经试过像

players.team.map(&:hash).find{ |x| x[ 'eligibility_settings?' ] == true} 

东西但是,当我尝试,我得到一个nil响应。 (这是奇怪)

我也看着使用Ruby detect方法,这没有得到我在任何地方任何

Players.team.map(&:hash).['hash.seligibiltiy_settings'].detect { true } 

会有人有任何想法如何处理这一个?

回答

0

players.team.map(&:hash).find{ |x| x[ 'eligibility_settings?' ] == true} 
Players.team.map(&:hash).['hash.seligibiltiy_settings'].detect { true } 
  • 是为playersPlayers
  • 为什么是复数?
  • 如果你可以拨打mapteam,它可能应该是复数
  • 为什么你转换为散列?
  • eligibility_settings?不是你的哈希键。 eligibility_settings
  • eligibility_settings可以是乱码,但它不能true
  • 如果你想检查它是否不为空,则使用!h['eligibility_settings'].empty?

可能的解决方法

你可以使用:

data = [ 
    { 
    'name' => 'jon doe', 
    'team' => 'team2', 
    'price' => 2000, 
    'eligibility_settings' => {} 
    }, 
    { 
    'name' => 'jonny doe', 
    'team' => 'team1', 
    'value' => 2000, 
    'eligibility_settings' => { 
     'player_gender' => 'male', 
     'player_max_age' => 26, 
     'player_min_age' => 23, 
     'established_union_only' => true 
    } 
    }, 
    { 
    'name' => 'jonni doe', 
    'team' => 'team3', 
    'price' => 2000, 
    'eligibility_settings' => {} 
    } 
] 

p data.find { |h| !h['eligibility_settings'].empty? } 

# {"name"=>"jonny doe", "team"=>"team1", "value"=>2000, "eligibility_settings"=>{"player_gender"=>"male", "player_max_age"=>26, "player_min_age"=>23, "established_union_only"=>true}} 

如果h['eligibility_settings']可以是nil,您可以使用:

data.find { |h| !h['eligibility_settings'].blank? } 

data.find { |h| h['eligibility_settings'].present? } 
+0

哇。非常彻底的答案。非常感谢你帮助我。绝对有用,我对你的方法有所了解。谢谢! – kdweber89