【问题标题】:Comparing array with array of hashes and outputing new array of hashes将数组与哈希数组进行比较并输出新的哈希数组
【发布时间】:2026-01-07 20:05:01
【问题描述】:

我有一个订阅实例数组@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 不匹配,我会将订阅存储在失败数组中。

我怎样才能达到这个结果?

【问题讨论】:

    标签: arrays ruby hash


    【解决方案1】:

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

    如果 hash 和 eql? 方法被覆盖以提供有意义的行为。默认情况下, 单独的实例引用单独的哈希键。

    所以我认为你应该覆盖你的 .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
    

    【讨论】:

      【解决方案2】:

      您可以尝试以下方法:

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

      【讨论】:

      • partition 是去这里的方式,但不需要 splat(*)。 a,b = [1,2] 将是 a #=&gt; 1; b#=&gt;2,因为这就是并行分配的工作方式。因为分区总是最多有 2 个嵌套数组,这将是一个足够的解决方案。