Ruby哈希数组; 只保留包含某个key => value对的第一个元素

JDR*_*no2 2 ruby arrays dictionary

假设我在Ruby中有以下哈希数组:

a = [{:id => 1, :species =>"Homo sapiens"},
     {:id => 2, :species =>"Canis lupus"},
     {:id => 3, :species =>"Bos taurus"},
     {:id => 4, :species =>"Homo sapiens"},
     {:id => 5, :species =>"Pan troglodytes"},
     {:id => 6, :species =>"Bos taurus"}]
Run Code Online (Sandbox Code Playgroud)

仅保留包含每个:species键的第一个元素(即丢弃任何重复物种名称的元素)的最惯用和简洁的方法是什么?对于上面的示例,所需的结果如下所示:

b = [{:id => 1, :species =>"Homo sapiens"},
     {:id => 2, :species =>"Canis lupus"},
     {:id => 3, :species =>"Bos taurus"},
     {:id => 5, :species =>"Pan troglodytes"}]
Run Code Online (Sandbox Code Playgroud)

我可以通过首先将所有物种读入第二个数组,删除重复数据uniq!,然后在原始数组中迭代包含第二个数组中表示的每个物种的第一个元素来完成此操作,但这看起来非常类似于Ruby,并且看起来很像相当丑陋.

Aru*_*hit 7

你只需要使用Array#uniq: -

a = [{:id => 1, :species =>"Homo sapiens"},
     {:id => 2, :species =>"Canis lupus"},
     {:id => 3, :species =>"Bos taurus"},
     {:id => 4, :species =>"Homo sapiens"},
     {:id => 5, :species =>"Pan troglodytes"},
     {:id => 6, :species =>"Bos taurus"}]

a.uniq { |h| h[:species] }
# => [{:id=>1, :species=>"Homo sapiens"},
#     {:id=>2, :species=>"Canis lupus"},
#     {:id=>3, :species=>"Bos taurus"},
#     {:id=>5, :species=>"Pan troglodytes"}]
Run Code Online (Sandbox Code Playgroud)

  • 太棒了 - 这很完美.既简洁又清晰.谢谢! (2认同)