2017-02-12 12 views
-1

私はCSVのために正規化している何百もの配列を持っています。Ruby Arrayのデフォルト値は?

[ 
    ["foo", "tom", nil,  1, 4, "cheese"], 
    ["foo", "tom", "fluffy",nil, 4], 
    ["foo", "tom", "fluffy",1, nil], 
    ... 
] 

現在、すべての長さを同じにするために、私は最大長を見つけて値に設定しています。

rows.each { |row| row[max_index] ||= nil }

それは新しい長さに等しい配列の長さになるので、これはクールです。

最後にnilの束を追加するのではなく、Nをインデックス(1ベース)としてCOLUMN_Nを追加する必要がありました。

table_rows.each do |row| 
    last_index = row.length - 1 
    (last_index..max_index).to_a.each { |index| row[index] ||= "COLUMN_#{index+1}" } 
end 

インデックスの機能であるデフォルト値を持つのは面倒なようでした。

+1

この問題を解決しようとしています。それがなければ、私たちがあなたのためにコードを書くことを望んでいるように見えますが、それはSOのためではありません。 "[ask]"とリンクされたページ "[mcve]"とhttp://meta.stackoverflow.com/q/261592/128421を読んで、何が期待されるのかを説明してください。 –

+0

@ theTinManの敬意を表します。私の質問を更新します –

+0

@theTinManが更新されました。 –

答えて

2

あなたがfetchを使用することができます代わりにnilのデフォルト値を取得するには、次の

row = ["foo", "tom", "fluffy", 1, 4] 
row.fetch(7) { |i| "COLUMN_#{i + 1}" } 
=> "COLUMN_8" 

しかし、それはあなたのための配列を埋めることはありません。

も参照してください:あなたは[]=メソッドを持つ要素を充填するためのデフォルト値を選択することはできませんCan I create an array in Ruby with default values?

2

を。しかし、交換したくない他のnilがない場合は、このようなことを簡単に行うことができます。

row.each_with_index.map { |item, index| item.nil? ? "column_#{index}": item } 
0

これはあなたのために働くようです。

class Array 
    def push_with_default(item, index, &block) 
    new_arr = Array.new([self.size + 1, index].max, &block) 
    self[index] = item 
    self.map!.with_index { |n, i| n.nil? ? new_arr[i] : n } 
    end 
end 

>> array = [1,2,5,9] 
[ 
    [0] 1, 
    [1] 2, 
    [2] 5, 
    [3] 9 
] 
>> array.push_with_default(2, 10) { |i| "column_#{i}" } 
[ 
    [ 0] 1, 
    [ 1] 2, 
    [ 2] 5, 
    [ 3] 9, 
    [ 4] "column_4", 
    [ 5] "column_5", 
    [ 6] "column_6", 
    [ 7] "column_7", 
    [ 8] "column_8", 
    [ 9] "column_9", 
    [10] 2 
] 

私はこのようなメソッドが既に存在しているとは思いません。

関連する問題