I have array of objects
const tableRows = [
{
id: "dba3d111",
name : "Budget 1",
dropdownOptions: [
{
"id": "UUID1",
"type": "Expenditure: Administration",
"name": "Office Supplies 1",
"chosen": true
},
{
"id": "UUID2",
"type": "Expenditure: Administration",
"name": "Office Supplies 2",
"chosen": false
},
{
"id": "UUID3",
"type": "Expenditure: Administration",
"name": "Office Supplies 3",
"chosen": false
},
{
"id": "UUID4",
"type": "Liability Group",
"name": "Vehicles 1",
"chosen": false
},
{
"id": "UUID5",
"type": "Liability Group",
"name": "Vehicles 2",
"chosen": false
},
{
"id": "UUID6",
"type": "Liability Group",
"name": "Vehicles 3",
"chosen": false
},
{
"id": "UUID7",
"type": "Liability Group",
"name": "Vehicles 4",
"chosen": false
}
]
},
{
id: "dba3d222",
name : "Budget 2",
dropdownOptions: [
{
"id": "UUID1",
"type": "Expenditure: Administration",
"name": "Office Supplies 1",
"chosen": false
},
{
"id": "UUID2",
"type": "Expenditure: Administration",
"name": "Office Supplies 2",
"chosen": true
},
{
"id": "UUID3",
"type": "Expenditure: Administration",
"name": "Office Supplies 3",
"chosen": false
},
{
"id": "UUID4",
"type": "Liability Group",
"name": "Vehicles 1",
"chosen": false
},
{
"id": "UUID5",
"type": "Liability Group",
"name": "Vehicles 2",
"chosen": false
},
{
"id": "UUID6",
"type": "Liability Group",
"name": "Vehicles 3",
"chosen": false
},
{
"id": "UUID7",
"type": "Liability Group",
"name": "Vehicles 4",
"chosen": false
}
]
},
{
id: "dba3d333",
name : "Budget 3",
dropdownOptions: [
{
"id": "UUID1",
"type": "Expenditure: Administration",
"name": "Office Supplies 1",
"chosen": false
},
{
"id": "UUID2",
"type": "Expenditure: Administration",
"name": "Office Supplies 2",
"chosen": false
},
{
"id": "UUID3",
"type": "Expenditure: Administration",
"name": "Office Supplies 3",
"chosen": true
},
{
"id": "UUID4",
"type": "Liability Group",
"name": "Vehicles 1",
"chosen": false
},
{
"id": "UUID5",
"type": "Liability Group",
"name": "Vehicles 2",
"chosen": false
},
{
"id": "UUID6",
"type": "Liability Group",
"name": "Vehicles 3",
"chosen": false
},
{
"id": "UUID7",
"type": "Liability Group",
"name": "Vehicles 4",
"chosen": false
}
]
}
];
I need to achieve the followings:
Count the amount of chosen options and if every option of each type has been chosen at least once I need to add property to option called disableType: true
. For the rest of option types disableType: false
needs to be added.
So the final output looks like:
const tableRows = [
{
id: "dba3d111",
name : "Budget 1",
dropdownOptions: [
{
"id": "UUID1",
"type": "Expenditure: Administration",
"name": "Office Supplies 1",
"chosen": true,
"disableType": true,
},
{
"id": "UUID2",
"type": "Expenditure: Administration",
"name": "Office Supplies 2",
"chosen": false,
"disableType": true
},
{
"id": "UUID3",
"type": "Expenditure: Administration",
"name": "Office Supplies 3",
"chosen": false,
"disableType": true
},
{
"id": "UUID4",
"type": "Liability Group",
"name": "Vehicles 1",
"chosen": false,
"disableType": false
},
{
"id": "UUID5",
"type": "Liability Group",
"name": "Vehicles 2",
"chosen": false,
"disableType": false
},
{
"id": "UUID6",
"type": "Liability Group",
"name": "Vehicles 3",
"chosen": false,
"disableType": false
},
{
"id": "UUID7",
"type": "Liability Group",
"name": "Vehicles 4",
"chosen": false,
"disableType": false
}
]
},
{
id: "dba3d222",
name : "Budget 2",
dropdownOptions: [
{
"id": "UUID1",
"type": "Expenditure: Administration",
"name": "Office Supplies 1",
"chosen": false,
"disableType": true,
},
{
"id": "UUID2",
"type": "Expenditure: Administration",
"name": "Office Supplies 2",
"chosen": true,
"disableType": true,
},
{
"id": "UUID3",
"type": "Expenditure: Administration",
"name": "Office Supplies 3",
"chosen": false,
"disableType": true,
},
{
"id": "UUID4",
"type": "Liability Group",
"name": "Vehicles 1",
"chosen": false,
"disableType": false
},
{
"id": "UUID5",
"type": "Liability Group",
"name": "Vehicles 2",
"chosen": false,
"disableType": false
},
{
"id": "UUID6",
"type": "Liability Group",
"name": "Vehicles 3",
"chosen": false,
"disableType": false
},
{
"id": "UUID7",
"type": "Liability Group",
"name": "Vehicles 4",
"chosen": false,
"disableType": false
}
]
},
{
id: "dba3d333",
name : "Budget 3",
dropdownOptions: [
{
"id": "UUID1",
"type": "Expenditure: Administration",
"name": "Office Supplies 1",
"chosen": false,
"disableType": true,
},
{
"id": "UUID2",
"type": "Expenditure: Administration",
"name": "Office Supplies 2",
"chosen": false,
"disableType": true,
},
{
"id": "UUID3",
"type": "Expenditure: Administration",
"name": "Office Supplies 3",
"chosen": true,
"disableType": true,
},
{
"id": "UUID4",
"type": "Liability Group",
"name": "Vehicles 1",
"chosen": false,
"disableType": false
},
{
"id": "UUID5",
"type": "Liability Group",
"name": "Vehicles 2",
"chosen": false,
"disableType": false
},
{
"id": "UUID6",
"type": "Liability Group",
"name": "Vehicles 3",
"chosen": false,
"disableType": false
},
{
"id": "UUID7",
"type": "Liability Group",
"name": "Vehicles 4",
"chosen": false,
"disableType": false
}
]
}
]
Please note that each option can only be selected once in each type and all more than one option of each type can be chosen in the same row, eg
[
{
"id": "UUID1",
"type": "Expenditure: Administration",
"name": "Office Supplies 1",
"chosen": true
},
{
"id": "UUID2",
"type": "Expenditure: Administration",
"name": "Office Supplies 2",
"chosen": true
},
{
"id": "UUID3",
"type": "Expenditure: Administration",
"name": "Office Supplies 3",
"chosen": true
},
]
So far I can calculate amount of options in each group with
const optionsCounter = {};
const selectedOptionsCounter = {};
tableRows[0].dropdownOptions.forEach((opt) => {
optionsCounter[opt.type] = (optionsCounter[opt.type] || 0) + 1;
});
tableRows.forEach((row) => {
row.dropdownOptions.forEach((opt) => {
if(opt.chosen === true) {
selectedOptionsCounter[opt.type] = (selectedOptionsCounter[opt.type] || 0) + 1;
}
})
})
Now I need to compare the values of optionsCounter
and selectedOptionsCounter
objects and assign disableType: true
to the corresponding types if the object values are the and disableType: false
for the other types.
At the moment the calculations are:
optionsCounter = {
"Expenditure: Administration": 3,
"Liability Group": 4
}
and
selectedOptionsCounter = {
"Expenditure: Administration": 3
}
what makes sense, but I have no idea what to do next to solve my problem