2015-10-13 157 views
0

我订阅实例的数组@subscription_valids和订阅的球员所组成的数组看起来像:比较哈希阵列阵列和outputing哈希值的新阵列

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

我需要做的是:每个认购@subscription_valids

@subscription_valids.each do |subscription| 

我需要检查,如果subscription.user.full_name,或者如果subscription.user.full_name_inversedarray_subscribed_player散列的一个关键(在为例“NAME0”,“名1”或“名2”)相匹配。

如果匹配,那么我应该将相关的subscription作为关键字存储在新阵列的散列中,并提取相关链接作为此散列的值。我最后outpout应该是一个数组,看起来像这样:

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

否则如果subscription.user.full_name犯规的比赛我将只存储在一个故障阵列订阅。

我该如何达到这个结果?

回答

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)} 
+0

分区是去这里的路但是不需要图示('*')。 'a,b = [1,2]'将是'a#=> 1; b#=> 2',因为这是并行分配的工作原理。因为分区总是会有最多2个嵌套数组,这将是一个充分的解决方案。 – engineersmnky

0

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

一我们如果使用散列和eql,er定义的类可以用作散列键? 方法被覆盖以提供有意义的行为。默认情况下, 单独的实例引用单独的散列键。

所以我认为你应该重写你的.eql?在@subscription_valids为有意义(如一个唯一的字符串)

我想不出一个阵列的方法方法,以便你可以去这样的:

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