Şöyle bir dizi var:Bu diziyi Ruby'de yeniden yapılandırmanın daha iyi bir yolu var mı?
{
year_list: [{
name: 2016,
make_list: [{
name: 'Honda',
model_list: [{
name: 'CRV',
series_list: [{
name: 'Premium Plus',
style_list: [{
name: '4D SUV',
uvc: '123abc'
}]
}]
}]
}]
}]
}
Ve ben bir karma birleştirilir yılın her kombinasyonu yapmak Aşağıda, model, seri ve stil için bu diziyi dönüştürmek istiyoruz ve takılı diziye
[{:year=> 2016,
:make=>"Honda",
:model=>"CRV",
:series=>"Premium Plus",
:style=>"4D SUV",
:uvc=>"123abc"}]
Ben çalışan bir çözüm var, ama kimse çözüm daha zarif bir çözüm yapmak konusunda herhangi bir fikir olup olmadığını merak ediyorum.
list = []
year_list.each do |y_val|
vehicle_type = {}
vehicle_type[:year] = y_val['name']
make_list = y_val['make_list']
make_list.each do |k_val|
vehicle_type[:make] = k_val['name']
model_list = k_val['model_list']
model_list.each do |m_val|
vehicle_type[:model] = m_val['name']
series_list = m_val['series_list']
series_list.each do |s_val|
vehicle_type[:series] = s_val['name']
style_list = s_val['style_list']
style_list.each do |st_val|
vehicle_type[:style] = st_val['name']
vehicle_type[:uvc] = st_val['uvc']
list << vehicle_type
end
end
end
end
end
Bunu daha iyi bir çözüm yapmak için Ruby'nin dizi yöntemlerinden bazılarını kullanmanın bir yolu var mı?
Düzenleme: İşte hemen hemen özyinelemeyi kullanarak çalışan bir çözüm.
VEHICLES = []
ELEMENTS = [:year, :make, :model, :series, :style]
def walk_tree(arr, vehicle={})
arr[0..1].each do |a|
name = a['name']
if a.key?('uvc')
vehicle[:uvc] = a['uvc']
VEHICLES << vehicle
vehicle = {}
next
end
ELEMENTS.each do |s|
key = s.to_s + '_list'
if a.key?(key)
vehicle[s] = name
walk_tree(a[key], vehicle)
end
end
end
end
walk_tree(year_list)
pp LIST
edilir: dahil uvc'? – sawa
'uvc' her yıl, marka, model, seri, stil kombinasyonu için benzersiz bir tanımlayıcıdır. Ne yazık ki, bu 3. parti API'nin döndürdüğü kaba bir veri yapısı ve neden normalleştirmeye çalışıyorum. – doremi