我怎么能根据另一个数组过滤和排序哈希数组?

new*_*ike -3 ruby arrays hash

我想过滤和排序哈希数组:

[
  {"_id"=>"THAILAND", "cities"=>["BANGKOK", "CHIANGMAI"]},
  {"_id"=>"MALAYSIA", "cities"=>["JAKARTA", "KUALA_LUMPUR"]},
  {"_id"=>"JAPAN", "cities"=>["HOKKAIDO", "FUKUOKA", "TOKYO", "IBARAKI", "ISHIGAKI", "OSAKA", "KUMAMOTO", "KAGOSHIMA", "NAGOYA", "OKINAWA"]},
  {"_id"=>"HONGKONG", "cities"=>["HONGKONG"]},
  {"_id"=>"KOREA", "cities"=>["SEOUL", "BUSAN"]},
  {"_id"=>"TAIWAN", "cities"=>["KAOHSIUNG", "TAIPEI"]},
  {"_id"=>"AUSTRALIA", "cities"=>["MELBOURNE", "GOLD_COAST", "PERTH", "SYDNEY"]},
  {"_id"=>"MACAU", "cities"=>["MACAU"]},
  {"_id"=>"SINGAPORE", "cities"=>["SINGAPORE"]}
]
Run Code Online (Sandbox Code Playgroud)

根据数组:

["JAPAN", "THAILAND", "KOREA", "TAIWAN", "AUSTRALIA", "MACAU", "SINGAPORE"]
Run Code Online (Sandbox Code Playgroud)

预期的结果是:

[
  {"_id"=>"JAPAN", "cities"=>["HOKKAIDO", "FUKUOKA", "TOKYO", "IBARAKI", "ISHIGAKI", "OSAKA", "KUMAMOTO", "KAGOSHIMA", "NAGOYA", "OKINAWA"]},
  {"_id"=>"THAILAND", "cities"=>["BANGKOK", "CHIANGMAI"]},
  {"_id"=>"KOREA", "cities"=>["SEOUL", "BUSAN"]},
  {"_id"=>"TAIWAN", "cities"=>["KAOHSIUNG", "TAIPEI"]},
  {"_id"=>"AUSTRALIA", "cities"=>["MELBOURNE", "GOLD_COAST", "PERTH", "SYDNEY"]},
  {"_id"=>"MACAU", "cities"=>["MACAU"]},
  {"_id"=>"SINGAPORE", "cities"=>["SINGAPORE"]}
]
Run Code Online (Sandbox Code Playgroud)

我怎么能以优雅的方式做到这一点?

这就是我计划实现它的方式.

我认为我的想法看起来很乱,不容易理解

    candidates = [
          {"_id"=>"THAILAND", "cities"=>["BANGKOK", "CHIANGMAI"]},
          {"_id"=>"MALAYSIA", "cities"=>["JAKARTA", "KUALA_LUMPUR"]},
          {"_id"=>"JAPAN", "cities"=>["HOKKAIDO", "FUKUOKA", "TOKYO", "IBARAKI", "ISHIGAKI", "OSAKA", "KUMAMOTO", "KAGOSHIMA", "NAGOYA", "OKINAWA"]},
          {"_id"=>"HONGKONG", "cities"=>["HONGKONG"]},
          {"_id"=>"KOREA", "cities"=>["SEOUL", "BUSAN"]},
          {"_id"=>"TAIWAN", "cities"=>["KAOHSIUNG", "TAIPEI"]},
          {"_id"=>"AUSTRALIA", "cities"=>["MELBOURNE", "GOLD_COAST", "PERTH", "SYDNEY"]},
          {"_id"=>"MACAU", "cities"=>["MACAU"]},
          {"_id"=>"SINGAPORE", "cities"=>["SINGAPORE"]}
        ]

    a = ["JAPAN", "THAILAND", "KOREA", "TAIWAN", "AUSTRALIA", "MACAU", "SINGAPORE"]

    a.inject([]) { h, country
        tmp_candidate = {}
        candidates.each do |candidate|
            if country == candidate['_id']
                tmp_candidate = candidate
                break
            end
        end
        h << tmp_candidate
        h
    }
Run Code Online (Sandbox Code Playgroud)

saw*_*awa 6

a = ["JAPAN", "THAILAND", "KOREA", "TAIWAN", "AUSTRALIA", "MACAU", "SINGAPORE"]

[{"_id"=>"THAILAND", "cities"=>["BANGKOK", "CHIANGMAI"]},
 {"_id"=>"MALAYSIA", "cities"=>["JAKARTA", "KUALA_LUMPUR"]},
 {"_id"=>"JAPAN", "cities"=>["HOKKAIDO", "FUKUOKA", "TOKYO", "IBARAKI", "ISHIGAKI", "OSAKA", "KUMAMOTO", "KAGOSHIMA", "NAGOYA", "OKINAWA"]},
 {"_id"=>"HONGKONG", "cities"=>["HONGKONG"]},
 {"_id"=>"KOREA", "cities"=>["SEOUL", "BUSAN"]},
 {"_id"=>"TAIWAN", "cities"=>["KAOHSIUNG", "TAIPEI"]},
 {"_id"=>"AUSTRALIA", "cities"=>["MELBOURNE", "GOLD_COAST", "PERTH", "SYDNEY"]},
 {"_id"=>"MACAU", "cities"=>["MACAU"]},
 {"_id"=>"SINGAPORE", "cities"=>["SINGAPORE"]}]
.select{|h| a.index(h["_id"])}
.sort_by{|h| a.index(h["_id"])}
Run Code Online (Sandbox Code Playgroud)