![](/img/trans.png)
[英]Ruby: array of hashes - how to remove duplicates based on the hash key which is an array
[英]Ruby - How to remove duplicates in array of hashes?
我在哈希數組中有一系列哈希。 我想根據內部數組的值刪除重復項。
topics = [{"defense"=>
[{:id=>30,
:source=>"Hacker News",
:title=>
"China-based campaign breached satellite, defense companies: Symantec",
:link=>
"https://www.reuters.com/article/us-china-usa-cyber/china-based-campaign-breached-satellite-defense-companies-symantec-idUSKBN1JF2X0"}]},
{"companies"=>
[{:id=>30,
:source=>"Hacker News",
:title=>
"China-based campaign breached satellite, defense companies: Symantec",
:link=>
"https://www.reuters.com/article/us-china-usa-cyber/china-based-campaign-breached-satellite-defense-companies-symantec-idUSKBN1JF2X0"}]},
{"Symantec"=>
[{:id=>30,
:source=>"Hacker News",
:title=>
"China-based campaign breached satellite, defense companies: Symantec",
:link=>
"https://www.reuters.com/article/us-china-usa-cyber/china-based-campaign-breached-satellite-defense-companies-symantec-idUSKBN1JF2X0"}]}]
topics.uniq { |phrase, post| post }
puts topics
您可以在上面看到, defense
, companies
和Symantec
的短語都包含相同的數組。 如何只保留包含其中一個相同數組的第一個哈希?
預期產量:
{"defense"=>
[{:id=>30,
:source=>"Hacker News",
:title=>
"China-based campaign breached satellite, defense companies: Symantec",
:link=>
"https://www.reuters.com/article/us-china-usa-cyber/china-based-campaign-breached-satellite-defense-companies-symantec-idUSKBN1JF2X0"}]}
注意:在上面的例子中,“短語”的每個內部數組只包含一個哈希,但在應用程序中它可以包含幾個帖子。
topics.invert.invert
會將哈希值減少為每個唯一值的單個(任意選擇)鍵。
使用此解決方案,您只獲得數組:
topics.map { |topic| topic.values }.uniq.flatten
它只返回:
# => [{:id=>30, :source=>"Hacker News", :title=>"China-based campaign breached satellite, defense companies: Symantec", :link=>"https://www.reuters.com/article/us-china-usa-cyber/china-based-campaign-breached-satellite-defense-companies-symantec-idUSKBN1JF2X0"}]
topics = [
{ "defense" => [{ id: 30, source: "Hacker", title: "China", link: "F2X0"}] },
{ "companies" => [{ id: 30, source: "Hacker", title: "China", link: "F2X0"}] },
{ "Symantec" => [{ id: 30, source: "Hacker", title: "China", link: "F2X0"}] }
]
topics.uniq { |h| h.values }
#=> [{"defense"=>[{:id=>30, :source=>"Hacker", :title=>"China", :link=>"F2X0"}]}]
有關uniq
使用塊的情況,請參閱Array #uniq 。 請注意句子“ self
按順序遍歷,並且第一次出現”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.