Arrays 如何比较和拒绝不同维度的数组项?

Arrays 如何比较和拒绝不同维度的数组项?,arrays,ruby,match,Arrays,Ruby,Match,我有一个一维数组,如下所示: topics = ["Cats", "Dogs", "Fish", "Snakes"] 我还有一个多维数组,其中包含每种动物类型的更多细节,但也按属对它们进行分类: genus = [["mammals",["Dogs", "Cats", "Tigers"]], ["reptiles", ["Snakes", "Lizards"]], ["amphibians", ["Fish", "Frogs", "Salamander"]]

我有一个一维数组,如下所示:

topics = ["Cats", "Dogs", "Fish", "Snakes"]
我还有一个多维数组,其中包含每种动物类型的更多细节,但也按属对它们进行分类:

genus = [["mammals",["Dogs", "Cats", "Tigers"]],
         ["reptiles", ["Snakes", "Lizards"]],
         ["amphibians", ["Fish", "Frogs", "Salamander"]]]
我试图做的是将主题与属进行比较,并通过删除主题中不包含的物种来修改属数组,但如果父属具有匹配的值,我希望保留父属。如果没有找到匹配的值,则应从新数组中删除整个属。最终结果将是:

genus = [["mammals", ["Dogs", "Cats"]],
        ["reptiles",  ["Snakes"]],
        ["amphibians", ["Fish"]]]
我尝试了一些方法,通过迭代主题并拒绝不匹配的物种,但它似乎拒绝了第一次迭代中的所有内容,使得后续迭代毫无意义

我已经尝试过选择匹配项并将其推送到一个新数组,这让我更接近了…但我更愿意更新现有数组,而不是创建一个新数组。这也没有考虑将该属保留为数组的一部分

任何帮助,帮助

我尝试的是:

genus_list = Array.new

topics.each do |topic|
    matched = genus.select { |type, species| species == topic }
    genus_list.push(matched)
end

在我看来,这有点像是用蛮力来解决问题,但这是目前我能想到的最好办法。这将在适当的位置修改genus数组

# these are as yours in the question, with the addition of a dinosaur genus to show
# that group gets removed from the end result
topics = ["Cats", "Dogs", "Fish", "Snakes"]
genus = [
  ["mammals",
    ["Dogs", "Cats", "Tiger"] ],
  ["reptiles",
    ["Snakes", "Lizards"] ],
  ["amphibians",
    ["Fish", "Frogs", "Salamander"]],
  ["dinosaur",
     ["Tyrannosaurus", "Pterodactyl"]]
]


genus.reject! do |_, animal_types|
  animal_types.reject! { |type| !topics.include?(type) }

  animal_types.empty?
end

p genus
# => [["mammals", ["Dogs", "Cats"]],
#     ["reptiles", ["Snakes"]],
#     ["amphibians", ["Fish"]]]

请分享你所做的尝试far@hamms我将列举一些例子。问题的数组纯粹是为了示例目的,因为实际数组是非常密集的。考虑使用哈希为属。在这种情况下,某种字典将是一个更好的数据结构。请编辑。鸟类是哺乳动物?赢家鸡肉晚餐!\u只是ruby未使用的变量名…只是说我没有使用这个值,所以我不关心,但它还有一个特殊的属性,您可以在参数列表中多次使用它,例如def doit_u、u、a或[[1,2,3]]。每个都做| u、u、a |在def doita、a、b和[[1,2,3]]时工作。每个都做| a、a,b |抛出错误这是相当严重的,因为我花了太多时间试图想出一个有意义的变量名。双重打击@SimpleLime
topics = ["Cats", "Dogs", "Fish", "Snakes"]

genus = [
  ["mammals", ["Dogs", "Cats", "Birds"]],
  ["reptiles", ["Snakes", "Lizards"]],
  ["amphibians", ["Fish", "Frogs", "Salamander"]],
  ["birds", ["Bluebirds", "Finches"]]
]

genus = genus.each_with_object([]) do |(vertibrate_class, species), arr|
  selective_species = species & topics
  arr << [vertibrate_class, selective_species] unless selective_species.empty?
end
  #=> [["mammals", ["Dogs", "Cats"]],
  #    ["reptiles", ["Snakes"]],
  #    ["amphibians", ["Fish"]]]