2017-02-12 3 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 s в конце мне нужно было добавить COLUMN_N, где N - индекс (на основе 1).

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

Мы хотели бы видеть вашу попытку решить эту проблему. Без этого похоже, что вы хотите, чтобы мы писали код для вас, для чего это не так. Пожалуйста, прочитайте «[ask]» и связанные страницы, «[mcve]» и http://meta.stackoverflow.com/q/261592/128421, что поможет объяснить, что ожидается. –

+0

@theTinMan уважение. Я обновлю свой вопрос –

+0

обновил @theTinMan. –

ответ

2

Чтобы получить значение по умолчанию вместо nil вы можете использовать fetch:

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 s, которые вы не хотите заменять.

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 
] 

Я не верю, что такой метод существует уже в массиве.

Смежные вопросы