2017-01-14 6 views
-1

私はitems配列を構築しようとしています。私はCSVファイルをループしていて、アイテムのリストを展開して一致するものが見つかると以下のコードを参照してください:ruby​​ .mapの結果を配列に追加しますか?

items = Array.new 
csv.each_with_index do |row,i| 
    items << ["a","b","c"].map {|x| row.to_s.gsub(/XXXXXXXXXX/, x.downcase)} 
end 
puts items.length 

これは希望するアイテムの配列に戻っていません。マップの結果を配列に間違って追加しましたか?

おかげで

+0

あなたはあなたの例では、 'i'を使用しないでください。ほんの一例ですからね? –

+0

あなたの現在の結果とあなたが望むものを結果として表示します。 – user2012677

答えて

2

はい、あなたは間違ってここでそれをやっている:

items << ["a","b","c"].map 

アイテムは、ネストされた配列として終わるでしょう。ここには何が起こっているのかの例があります。

arr = [] 
arr << [1].map { |x| x } 
arr 
# => [[1]] 

代わりに+=を使用できます。あなたはスプラット演算子を使用している場合

またpushを使用することができます。経験則として

arr = [] 
arr.push *["a","b","c"].map { |x| x } 
arr 
# => ["a", "b", "c"] 
+0

完璧!あなたより。私は '*'について何も知らなかった。私は時間が経過するとすぐに受け入れ、stackoverflowは私に – AnApprentice

+1

をいくつか使用させます。[here](http://blog.honeybadger.io/ruby-splat-array-manipulation-destructuring/)を参照してください。この場合、 'push'は連続した引数を受け取りますので、' push(:a、:b)== push(* [:a、:b])== push(*%i {a b}) '。最後のシンボルは、シンボルの配列を構成するために省略表現を使用します。 –

0

を、あなたがしている場合:要素を反復空の配列

  • を初期化

    • を、配列を変更する
    • 最後に配列を戻す

    Ruby Enumerableメソッドがあります。

    このケースでは、flat_mapwith_indexを使用することができます。

    csv = %w(1;2;3 4;5;6 7;8;9) 
    
    items = csv.flat_map.with_index do |row,i| 
        ["a","b","c"].map {|x| row.to_s.gsub(/[159]/, x.downcase)} 
    end 
    
    p items 
    #=> ["a;2;3", "b;2;3", "c;2;3", "4;a;6", "4;b;6", "4;c;6", "7;8;a", "7;8;b", "7;8;c"] 
    
  • 関連する問題