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"]]]