将数组与散列数组进行比较并输出新的散列数组

时间:2015-10-13 11:47:10

标签: arrays ruby hash

我有一个订阅实例数组@subscription_valids和一个订阅播放器数组,看起来像这样:

array_subscribed_players = [{"name0" => "link1"}, {"name1"=>"link2"}, {"name2"=>"link3"}....]

我需要做的是:对于@subscription_valids中的每个订阅:

@subscription_valids.each do |subscription|

我需要检查subscription.user.full_namesubscription.user.full_name_inversed是否匹配array_subscribed_player哈希值中的某个键(例如“name0”,“name1”或“name2”)

如果匹配,那么我应该将相关的subscription作为密钥存储在新数组的散列中,并将相关链接提取为此散列的值。我的最终输出应该是一个如下所示的数组:

[{subscription1 => "link1"}, {subscription2 => "link2}, ...]

否则,如果subscription.user.full_name不匹配,我只会将订阅存储在故障数组中。

如何实现这一结果?

2 个答案:

答案 0 :(得分:0)

您可以尝试以下操作:

valid = array_subscribed_players.select{|x| @subscription_valids.map(&:name).include?(x.keys.first)}

Demo

如果您需要在某处存储有效值和无效值:

valid, invalid = array_subscribed_players.partition{|x| @subscription_valids.map(&:name).include?(x.keys.first)}

答案 1 :(得分:0)

请参阅http://ruby-doc.org/core-2.2.3/Hash.html

  

如果哈希和eql,用户定义的类可以用作哈希键?   重写方法以提供有意义的行为。默认情况下,   单独的实例引用单独的哈希键。

所以我认为你应该覆盖你的.eql? @subscription_valids中的方法有意义的东西(如唯一的字符串)

我想不出一个Array方法所以你可以这样:

demo

results = []
failures = []
@subscription_valids.each do |subscription|
    array_subscribed_players.each do |player| 
        if player.keys.first == subscription.user.full_name || player.keys.first == subscription.user.full_name_inversed   
            results << { subscription => player[player.keys.first] }
        else
            failures << subscription
        end
    end
end