I am trying to modify an array. I have the following json.
[
{ state: "NY", key: "A", value: "Alarm" },
{ state: "CT", key: "A", value: "Alarm" },
{ state: "NH", key: "A", value: "Alarm" },
{ state: "CT", key: "B", value: "Audible and Etched" },
{ state: "NH", key: "B", value: "Audible and Etched" },
{ state: "NY", key: "AA", value: "Active Disabling and Anti-Theft" },
{ state: "FL", key: "B", value: "Audible and Etched" },
{ state: "FL", key: "A", value: "Alarm" },
{ state: "FL", key: "AA", value: "Active Disabling and Anti-Theft" }
]
Based on each unique state , I need to group the key , values into dropdown-array as shown below
[{
state: "NY",
dropdown: [
{ key: "A", value: "Alarm" },
{ key: "AA", value: "Active Disabling and Anti-Theft" }
]
},
{
state: "CT",
dropdown: [
{ key: "A", value: "Alarm" },
{ key: "B", value: "Audible and Etched" }
]
},
{
state: "NH",
dropdown: [
{ key: "A", value: "Alarm" },
{ key: "B", value: "Audible and Etched" }
]
},
{
state: "FL",
dropdown: [
{ key: "A", value: "Alarm" },
{ key: "B", value: "Audible and Etched" },
{ key: "AA", value: "Active Disabling and Anti-Theft" }
]
}]
Any Help would be Appreciated. Thanks.
CodePudding user response:
You can use Array.reduce
to get the modified array.
const inputArray = [
{ state: "NY", key: "A", value: "Alarm" },
{ state: "CT", key: "A", value: "Alarm" },
{ state: "NH", key: "A", value: "Alarm" },
{ state: "CT", key: "B", value: "Audible and Etched" },
{ state: "NH", key: "B", value: "Audible and Etched" },
{ state: "NY", key: "AA", value: "Active Disabling and Anti-Theft" },
{ state: "FL", key: "B", value: "Audible and Etched" },
{ state: "FL", key: "A", value: "Alarm" },
{ state: "FL", key: "AA", value: "Active Disabling and Anti-Theft" }
];
const result = inputArray.reduce((acc, item) => {
const exist = acc.find(e => e.state == item.state);
if (exist) {
exist.dropdown.push({
key: item.key,
value: item.value
})
} else {
acc.push({
state: item.state,
dropdown: [{
key: item.key,
value: item.value
}]
});
}
return acc;
}, []);
console.log(result);