2017-02-12 2 views
-1

Ich habe Hunderte von Arrays, die für eine CSV normalisieren.Ruby Array Standardwert?

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

Derzeit, um alle gleich lang zu machen, finde ich die maximale Länge und Einstellung auf einen Wert.

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

das ist cool, weil es die Array-Länge gleich der neuen Länge macht.

Anstatt eine Reihe von nil s am Ende anzufügen, musste ich anhängen, wobei N der Index ist (1-basiert).

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

Was schien eine peinliche Möglichkeit, einen Standardwert, der eine Funktion des Index ist.

+1

Wir würden gerne Ihren Versuch sehen, dies zu lösen. Ohne dass es so aussieht, als ob wir Code für Sie schreiben sollen, wofür SO nicht ist. Bitte lesen Sie "[fragen]" und die verlinkten Seiten, "[mcve]" und http://meta.stackoverflow.com/q/261592/128421, die erklären, was zu erwarten ist. –

+0

@theTinMan Respekt. Ich werde meine Frage aktualisieren –

+0

@theTinMan aktualisiert. –

Antwort

2

Sie keinen Standardwert für Füllelemente mit []= Methode wählen können. Aber Sie können einfach so etwas tun, wenn es keine anderen nil s gibt, die Sie nicht ersetzen möchten.

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

Dies scheint wie es für Sie arbeiten könnte.

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 
] 

Ich glaube nicht, dass eine Methode wie diese auf Array bereits existiert.