比较两个哈希数组并返回新对象

3
我有两个哈希数组。
burgers = [
            {:id => 1, :name => "cheese burger"},
            {:id => 2, :name => "royale"},
            {:id => 3, :name => "big mac"},
            {:id => 4, :name => "angus beef"}
          ]

eaten =   [
            {:burger_id => 1},
            {:burger_id => 2}
          ]

我希望返回一组未吃汉堡的数组,其burgers[:id]不等于eaten[:burger_id]。在burgers_not_eaten_method方法中,我期望返回这个值。

def burgers_not_eaten
  #Not sure how to compare burger[:id] with eaten[:burger_id]
  burgers.reject { |burger| burger[:id] == #eaten burger_id }
  # Expected:  [{:id => 3, :name => "big mac"},{:id => 4, :name => "angus beef"}]
end

只是一个有趣的提示:如果ID不是必需的,我建议使用Set - Dbz
1个回答

5

您离正确答案很近了,为了更简单,我会将所有“已使用”的id值存入一个数组中,并检查其是否包含在该数组中,代码如下:

BURGERS = [
            {:id => 1, :name => "cheese burger"},
            {:id => 2, :name => "royale"},
            {:id => 3, :name => "big mac"},
            {:id => 4, :name => "angus beef"}
          ]

EATEN = [
          {:burger_id => 1},
          {:burger_id => 2}
        ]

def burgers_not_eaten
  eaten_ids = EATEN.map { |e| e[:burger_id] }
  BURGERS.reject { |burger| eaten_ids.include?(burger[:id]) }
end

burgers_not_eaten
# => [{:id=>3, :name=>"big mac"}, {:id=>4, :name=>"angus beef"}] 

1
哈哈,你比我快了41秒,而我们答案之间唯一的区别就是使用了reject/select!你得到了功劳 ;) - MrYoshiji
或者,eaten_ids = EATEN.flat_map { |burger| burger.values },这样如果 EATEN 哈希中的键名更改了,您就不需要更改该行。 - Cary Swoveland
正是我想要的。 - pmannion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接