📅  最后修改于: 2023-12-03 15:27:28.985000             🧑  作者: Mango
在 Ruby 2.7 中,Enumerable 模块新增了 flat_map 方法,用于映射每个元素并将结果打平为单个数组。这个方法的工作原理与 map 方法类似,但它会将多维数组的子数组展平为单个数组。这个功能通常与嵌套的数组一起使用。
flat_map { |obj| block } -> Array
flat_map -> Enumerator
flat_map
方法接受一个块作为参数,用于对集合中的每个元素进行映射操作。映射的结果将被打平成单个数组返回。
arr = [[1, 2], [3, 4], [5, 6]]
result = arr.flat_map { |el| el.map { |n| n * 2 } }
puts result.inspect #=> [2, 4, 6, 8, 10, 12]
在上面的例子中,我们首先定义了一个二维数组 arr
,其中包含了三个子数组。然后我们调用了 flat_map 方法对每个子数组进行了一个映射操作,并将结果打平为单个数组。最后,我们将结果输出,得到了期望的数组 [2, 4, 6, 8, 10, 12]
。
class Person
attr_reader :name, :pets
def initialize(name, pets)
@name, @pets = name, pets
end
end
people = [
Person.new("Alice", ["cat", "dog"]),
Person.new("Bob", ["parrot"]),
Person.new("Charlie", ["zebra", "lion", "giraffe"])
]
result = people.flat_map { |person| person.pets.map { |pet| [person.name, pet] } }
puts result.inspect
#=> [["Alice", "cat"], ["Alice", "dog"], ["Bob", "parrot"],
# ["Charlie", "zebra"], ["Charlie", "lion"], ["Charlie", "giraffe"]]
在上面的例子中,我们定义了一个名为 Person
的类,每个实例包含了一个名字和一个宠物数组。我们还定义了一个数组 people
,其中包含了多个 Person
实例。然后我们调用了 flat_map 方法对每个实例的宠物数组进行了一个映射操作,并将结果打平为单个数组。最后,我们将结果输出,得到了期望的数组 ["Alice", "cat"], ["Alice", "dog"], ["Bob", "parrot"], ["Charlie", "zebra"], ["Charlie", "lion"], ["Charlie", "giraffe"]
。
可枚举的 flat_map
方法是一种强大而有用的工具,用于将多维数组的子数组打平为单个数组。这个方法的使用可以使我们更有效地编写代码,并且可以使我们在处理大规模数据时保持代码简单易读。