2017-07-21 31 views
6

Tôi đang cố gắng tạo hàm để hoàn thành chuỗi giờ trong băm sau.Cách tạo và điền dữ liệu bị thiếu theo dãy số trong một băm

{ 
    name: "cardio", 
    data: [["06:00", 999], ["09:00", 154], ["10:00", 1059], ["11:00", 90]] 
} 

Nó nên tạo tất cả các giá trị bị mất trong các dữ liệu lĩnh vực

["07:00", 0], ["08:00", 0], ["12:00", 0], ["13:00", 0] ... ["23:00", 0] 

Kết quả mong đợi:

{ 
name: "cardio", 
data: [["06:00", 999], ["07:00", 0], ["08:00", 0], ["09:00", 154], ["10:00", 1059], ["11:00", 90]], ["12:00", 0], ["13:00", 0] ... ["23:00", 0] 
} 

Có thể làm điều đó? Một cái gì đó như:

data.each do |row| 
(6..23).each do |hour| 
    ..... 
    end 
end 

Trả lời

8

Bạn có thể tận dụng Array#assoc để làm một cái gì đó như thế này:

kiếm thông qua một mảng mà các phần tử cũng mảng so sánh obj với các yếu tố đầu tiên của mỗi mảng chứa sử dụng obj. ==.

input = { 
    name: "cardio", 
    data: [["06:00", 999], ["09:00", 154], ["10:00", 1059], ["11:00", 90]] 
} 

input[:data] = 24.times.collect do |hour| 
    hour = "%02d:00" % hour 

    input[:data].assoc(hour) || [hour, 0] 
end 

puts input.inspect 
# {:name=>"cardio", :data=>[["00:00", 0], ["01:00", 0], ["02:00", 0], ["03:00", 0], ["04:00", 0], ["05:00", 0], ["06:00", 999], ["07:00", 0], ["08:00", 0], ["09:00", 154], ["10:00", 1059], ["11:00", 90], ["12:00", 0], ["13:00", 0], ["14:00", 0], ["15:00", 0], ["16:00", 0], ["17:00", 0], ["18:00", 0], ["19:00", 0], ["20:00", 0], ["21:00", 0], ["22:00", 0], ["23:00", 0]]} 
2

liệu

h = {name:"cardio", data:[["06:00", 999], ["09:00", 154], ["10:00", 1059], ["11:00", 90]]} 
first = 7 
last = 23 

mdata = (first..last).each_with_object(h[:data].to_h) { |hour,g| 
    g["%02d:00" % hour] ||= 0 }.sort 
    #=> [["06:00", 999], ["07:00", 0], ["08:00", 0], ["09:00", 154], ["10:00", 1059], 
    # ["11:00", 90], ["12:00", 0],..., ["21:00", 0], ["23:00", 0]] 
h.merge(h).merge(data: mdata) 
    #=> {:name=>"cardio", 
    # :data=>[["06:00", 999], ["07:00", 0], ["08:00", 0], ["09:00", 154], 
    #   ["10:00", 1059], ["11:00", 90], ["12:00", 0],...["23:00", 0]] 
Các vấn đề liên quan