Hello,
I have a list of maps as shown below:
[
%{
amount: #Decimal<0.10>,
charge: #Decimal<0.90>,
entity_name: "Entity 1",
image_file: "81f4c6ba494a543caa942ceb6184b7ed.jpg",
product_div: "Huawei Nova",
product_sub_div: "Nova lite",
product_sub_div_id: 398,
reference: "Nova lite",
req_date: "2019-10-11 13:24:23",
status: "Failure",
status_msg: "FAILED",
},
%{
amount: #Decimal<0.10>,
charge: #Decimal<0.90>,
entity_name: "Entity 2",
image_file: "26967a75af75ee2326adc1336d9b704e.jpg",
product_div: "Grill Microwave",
product_sub_div: "Binatone Microwave & Grill with Digital Display 20L 2017",
product_sub_div_id: 411,
reference: "Binatone Microwave & Grill with Digital Display 20L 2017",
req_date: "2019-10-10 17:14:33",
status: "Failure",
status_msg: "FAILED",
},
%{
amount: #Decimal<0.10>,
charge: #Decimal<0.90>,
entity_name: "Entity 2",
image_file: "26967a75af75ee2326adc1336d9b704e.jpg",
product_div: "Grill Microwave",
product_sub_div: "Binatone Microwave & Grill with Digital Display 20L 2017",
product_sub_div_id: 411,
reference: "Binatone Microwave & Grill with Digital Display 20L 2017",
req_date: "2019-10-10 11:02:38",
status: "Failure",
status_msg: "FAILED",
}
]
I want to be able to loop through this list to achieve the result below:
[
%{
details: [
%{
amount: #Decimal<0.10>,
charge: #Decimal<0.90>,
reference: "Binatone Microwave & Grill with Digital Display 20L 2017",
req_date: "2019-10-10 11:02:38",
status: "Failure",
status_msg: "FAILED"
},
%{
amount: #Decimal<0.10>,
charge: #Decimal<0.90>,
reference: "Binatone Microwave & Grill with Digital Display 20L 2017",
req_date: "2019-10-10 17:14:33",
status: "Failure",
status_msg: "FAILED"
}
],
entity_name: "Entity 2",
image_file: "26967a75af75ee2326adc1336d9b704e.jpg",
product_sub_div: "Binatone Microwave & Grill with Digital Display 20L 2017",
product_sub_div_id: 411
},
%{
details: [
%{
amount: #Decimal<0.10>,
charge: #Decimal<0.90>,
reference: "Nova lite",
req_date: "2019-10-11 13:24:23",
status: "Failure",
status_msg: "FAILED"
}
],
entity_name: "Entity 1",
image_file: "81f4c6ba494a543caa942ceb6184b7ed.jpg",
product_sub_div: "Nova lite",
product_sub_div_id: 398
}
]
My code is as below:
def group_products_by_sub_div([], _id_arr, acc) do
if length(acc) > 0 do
{:ok, acc}
else
IO.puts "No record was retrieved"
end
end
def group_products_by_sub_div([hd|tl], id_arr, acc) do
product_sub_div_id=hd[:product_sub_div_id]
product_sub_div=hd[:product_sub_div]
amount=hd[:amount]
status=hd[:status]
reference=hd[:reference]
req_date=hd[:req_date]
status_msg=hd[:status_msg]
entity_name=hd[:entity_name]
image_file=hd[:image_file]
charge=hd[:charge]
main_map=%{product_sub_div: product_sub_div, product_sub_div_id: product_sub_div_id, entity_name: entity_name, image_file: image_file}
details=[%{amount: amount, status: status, reference: reference, req_date: req_date, status_msg: status_msg, charge: charge}]
cnt=Enum.count(id_arr, &(&1 == product_sub_div_id))
id_arr=if cnt==1 do
id_arr
else
[product_sub_div_id] ++ id_arr
end
str=if cnt==1 do
map=Enum.find(acc, fn map -> map[:product_sub_div_id]==product_sub_div_id end)
val=if !is_nil(map[:product_sub_div_id]) do
details ++ map[:details]
end
Map.merge(main_map, %{details: val})
else
Map.merge(main_map, %{details: details})
end
acc=[str] ++ acc
group_products_by_sub_div(tl, id_arr, acc)
end
The above code gives me the result below, which is not accurate:
[
%{
details: [
%{
amount: #Decimal<0.10>,
charge: #Decimal<0.90>,
reference: "Binatone Microwave & Grill with Digital Display 20L 2017",
req_date: "2019-10-10 11:02:38",
status: "Failure",
status_msg: "FAILED"
},
%{
amount: #Decimal<0.10>,
charge: #Decimal<0.90>,
reference: "Binatone Microwave & Grill with Digital Display 20L 2017",
req_date: "2019-10-10 17:14:33",
status: "Failure",
status_msg: "FAILED"
}
],
entity_name: "Entity 2",
image_file: "26967a75af75ee2326adc1336d9b704e.jpg",
product_sub_div: "Binatone Microwave & Grill with Digital Display 20L 2017",
product_sub_div_id: 411
},
%{
details: [
%{
amount: #Decimal<0.10>,
charge: #Decimal<0.90>,
reference: "Binatone Microwave & Grill with Digital Display 20L 2017",
req_date: "2019-10-10 17:14:33",
status: "Failure",
status_msg: "FAILED"
}
],
entity_name: "Entity 2",
image_file: "26967a75af75ee2326adc1336d9b704e.jpg",
product_sub_div: "Binatone Microwave & Grill with Digital Display 20L 2017",
product_sub_div_id: 411
},
%{
details: [
%{
amount: #Decimal<0.10>,
charge: #Decimal<0.90>,
reference: "Nova lite",
req_date: "2019-10-11 13:24:23",
status: "Failure",
status_msg: "FAILED"
}
],
entity_name: "Telefonika",
image_file: "81f4c6ba494a543caa942ceb6184b7ed.jpg",
product_sub_div: "Nova lite",
product_sub_div_id: 398
}
]
I would be grateful for any assistance in this regard.
Thanks.
Jerry