В первом случае data[:recordset][:row]
- это не массив, а хэш, поэтому при его повторении переменная hash
становится массивом:
[:property, [{:name=>"Code", :value=>"C0001"}, {:name=>"Customer", :value=>"ROSSI MARIO"}]]
Во втором случае это массив, а не хэш, поэтому при его повторении он становится хешем:
{:property=>[{:name=>"Code", :value=>"C0001"}, {:name=>"Customer", :value=>"ROSSI MARIO"}, {:name=>"Phone1", :value=>"1234567890"}]}
Вы всегда предполагаете, что это второй формат. Вы можете принудительно преобразовать его в массив, а затем сгладить на 1 уровень, чтобы обработать оба экземпляра одинаково:
result = [data[:recordset][:row]].flatten(1).each_with_object([]) do |hash, out|
out << hash[:property].each_with_object({}) do |h, o|
o[h[:name]] = h[:value]
end
end
# => [{"Code"=>"C0001", "Customer"=>"ROSSI MARIO"}] # result from example 1
# => [{"Code"=>"C0001", "Customer"=>"ROSSI MARIO", "Phone1"=>"1234567890"},
# {"Code"=>"C0002", "Customer"=>"VERDE VINCENT",
# "Phone1"=>"9876543210", "Phone2"=>"2468101214"}] # result from example 2
Заманчиво попытаться использовать Kernal#Array()
вместо [].flatten(1)
, но вы должны помнить, что Hash реализует to_a
для возврата вложенного массива ключей и значений, поэтому Kernal#Array()
не делает не работает так, как вы хотели бы:
Array(data[:recordset][:row]) # using the first example data
# => [[:property, [{:name=>"Code", :value=>"C0001"}, {:name=>"Customer", :value=>"ROSSI MARIO"}]]]