2016-11-02 8 views
1

で作業するとき、私はあなたが変数の長さのハッシュの配列を持っていて、個別に各1で作業したい場合flat_mapは偉大だと思う:flat_map異なる要素

data = [ 
    {'apple' => 'fruit'}, 
    {'carrot' => 'vegetable'}, 
    {'orange' => 'fruit', 'pear' => 'fruit'}, 
    {'lettuce' => 'vegetable'} 
] 

data.flat_map(&:to_a).reduce([]) {|acc, (k,v)| acc << Hash[k,v] } 
=> [{"apple"=>"fruit"}, {"carrot"=>"vegetable"}, {"orange"=>"fruit"}, {"pear"=>"fruit"}, {"lettuce"=>"vegetable"}] 

しかし、私は私は思いませんflat_mapを完全に理解する。 docsによると:

は、列挙型のすべての要素に対して一度ブロック を実行しているの連結業績を持つ新しい配列を返します。

しかし、この例を見て:

[[1], {a: "a"}, {b: "b"}].flat_map(&:to_a) 
=> [1, [:a, "a"], [:b, "b"]] 

最初の項目は、内側アレイから剥離され、他の項目は、アレイに変換されます。これをどうやって知っていますか?

私はこのようなto_aを呼び出す:

[1].to_a 
=> [1] 
[1].to_a.flatten 
=> [1] 

あなたは結果がflat_mapがやったこととは異なっている参照してください。最初の例で配列の項目を削除するためにflat_mapは何をしていますか?

答えて

2

arr.map { ... } 

戻り残し、flat_mapmapを変更することによって、その後、a1, a2,.., amが配列されているとo1, o2,.., onが配列以外のオブジェクトである

[a1, a2,.., am, o1, o2,.., on] 

あれば任意の配列arrは、m+n要素を有するためブロックは変更されず、flat_mapが返されます

[*a1, *a2,.., *am, o1, o2,.., on] 

例1

arr = [[1], {a: "a"}, {b: "b"}] 

ために、我々は

arr.map(&:to_a) 
    #=> [[1], [[:a, "a"]], [[:b, "b"]]] 

を持っているので、それは次のよう

arr.flat_map(&:to_a) 

は返信します

[*[1], *[[:a, "a"]], *[[:b, "b"]]] 
    #=> [1, [:a, "a"], [:b, "b"]] 

本当にあります。

例2

我々は

arr = [1, 'cat', [2,3], {a: 4}] 

その後、

arr.map(&:itself) 
    #=> [1, "cat", [2, 3], {:a=>4}] 

ので

arr.flat_map(&:itself) 

さを持っていることを今仮定

[1, "cat", *[2, 3], {:a=>4}] 
の減少である

[1, "cat", 2, 3, {:a=>4}] 

を返すために見つけ

1

[1].flatten[1]です。第2レベルはありません。 [[1]].flatten[1]です。これはあなたの最後の例と他のすべての違いです。

あなたは(キーと値のペアであり、それぞれが)配列の配列に各ハッシュarrayifiesこと無地mapまず、

[[1], {a: "a"}, {b: "b"}].map(&:to_a) 
# => [[1], [[:a, "a"]], [[:b, "b"]]] 

注意をしよう。あなたは1つのレベルでそれをflatten時:

[[1], {a: "a"}, {b: "b"}].map(&:to_a).flatten(1) 
# => [1, [:a, "a"], [:b, "b"]] 

これは、あなたがflat_mapとなっている正確に何です。

関連する問題