語境與代碼示例如何「分裂和基團」的對象基於其屬性
之一的陣列我有一個稱爲TimesheetEntry類的實例的Array。
這裏是TimesheetEntry構造:
def initialize(parameters = {})
@date = parameters.fetch(:date)
@project_id = parameters.fetch(:project_id)
@article_id = parameters.fetch(:article_id)
@hours = parameters.fetch(:hours)
@comment = parameters.fetch(:comment)
end
創建TimesheetEntry的陣列的數據與來自一個.csv
文件對象:
timesheet_entries = []
CSV.parse(source_file, csv_parse_options).each do |row|
timesheet_entries.push(TimesheetEntry.new(
:date => Date.parse(row['Date']),
:project_id => row['Project'].to_i,
:article_id => row['Article'].to_i,
:hours => row['Hours'].gsub(',', '.').to_f,
:comment => row['Comment'].to_s.empty? ? "N/A" : row['Comment']
))
end
all_timesheets = Set.new []
timesheet_entries.each do |entry|
all_timesheets << { 'date' => entry.date, 'entries' => [] }
end
現在,我想用TimesheetEntries填充該哈希中的數組。 每個哈希數組必須只包含一個特定日期的TimesheetEntries。
我這樣做,是這樣的:
timesheet_entries.each do |entry|
all_timesheets.each do |timesheet|
if entry.date == timesheet['date']
timesheet['entries'].push entry
end
end
end
雖然這種方法能夠完成任務,這不是很有效的(我是相當新的這個)。
問題
什麼是實現相同的最終結果的一個更有效的方法?實質上,我想要「拆分」TimesheetEntry對象數組,將具有相同日期的對象「分組」。
謝謝!從你的答案中學到了幾件新事物。我一直認爲'Set'比'Hash'或'Array'快,用於過濾出獨特的項目,因爲當你嘗試添加它們時會自動忽略重複;我需要深入研究。另外,我不知道「|| ='或」group_by「。 – Leif
我按照你的建議用幾行代碼替換了幾乎所有的代碼:'all_timesheets = timesheet_entries.group_by(&:date)',它也更快。男人,我愛Ruby。再次感謝指針。 – Leif