Arrays 比较数组与散列数组并输出新的散列数组

Arrays 比较数组与散列数组并输出新的散列数组,arrays,ruby,hash,Arrays,Ruby,Hash,我有一个订阅实例数组@subscription\u valids和一个订阅播放器数组,如下所示: array_subscribed_players = [{"name0" => "link1"}, {"name1"=>"link2"}, {"name2"=>"link3"}....] 我需要做的是:对于@subscription\u valids中的每个订阅: @subscription_valids.each do |subscription| 我需要检查subscrip

我有一个订阅实例数组
@subscription\u valids
和一个订阅播放器数组,如下所示:

array_subscribed_players = [{"name0" => "link1"}, {"name1"=>"link2"}, {"name2"=>"link3"}....]
我需要做的是:对于
@subscription\u valids
中的每个订阅:

@subscription_valids.each do |subscription|
我需要检查
subscription.user.full\u name
subscription.user.full\u name\u inversed
是否与
array\u subscripted\u player
散列中的一个键匹配(在示例“name0”、“name1”或“name2”中)

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

[{subscription1 => "link1"}, {subscription2 => "link2}, ...]
否则,如果
subscription.user.full\u名称不匹配,我将只将订阅存储在失败数组中


如何实现此结果?

您可以尝试以下方法:

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

如果需要在某个位置存储有效值和无效值:

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

如果哈希和eql? 方法被重写以提供有意义的行为。默认情况下, 单独的实例指的是单独的哈希键

所以我认为你应该重写你的.eql?@subscription_valids中的方法可用于有意义的内容(如唯一字符串)

我无法考虑数组方法,因此您可以这样做:

results=[]
失败=[]
@认购有效。每一笔认购有效|
数组|u订阅|u玩家。每个做|玩家|
如果player.keys.first==subscription.user.full_name | | player.keys.first==subscription.user.full_name_反转
结果播放器[player.keys.first]}
其他的

故障分区是这里的方法,但不需要splat(
*
)<代码>a,b=[1,2]
将是
a#=>1;b#=>2
因为这就是并行分配的工作原理。因为分区总是最多有2个嵌套数组,所以这将是一个足够的解决方案。
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