Lodash group by multiple properties if property value is true
Since you're already using lodash, you can take advantage of the _.filter function. This will return only the items where selected
is true.
var selectedVehicles = _.filter(response.vehicleTypes, 'selected');
Now that you have the selectedVehicles
array, you can use your original code for grouping by the makeCode
.
selectedVehicles = _.groupBy(selectedVehicles, function(item) {
return item.makeCode;
});
This returns an object, so we will need to iterate through those keys, and perform our second groupBy
_.forEach(selectedVehicles, function(value, key) {
selectedVehicles[key] = _.groupBy(selectedVehicles[key], function(item) {
return item.modelCode;
});
});
From this you will have an object of the form. I'll leave it to you to get the count from each array.
{ 'Make-A': { 'Model-a': [ ... ] },
'Make-B': { 'Model-c': [ ... ] },
'Make-C': { 'Model-b': [ ..., ... ] } }
I am not sure if this will solve Your problem, but in group_by You can add custom logic which allow You to create composite key.
Remember that SEPERATOR value should be defined accordingly to data source You work with, if "--" characters occur in model or type You should not used them as it will not allow You to reverse the process of grouping.
const SEPERATOR = "--";
_.chain(data).filter((item) => item.selected).groupBy((item)=>`${item.model}${SEPERATOR}${item.type}`).value();