const vehicle = [ { a: [ { vehicle_name: "Toyota", color: "black" }, { vehicle_name: "Toyota", color: "red" }, { vehicle_name: "Ford", color: "yellow" }, { vehicle_name: "Toyota", color: "white" } ] }, { b: [ { vehicle_name: "Honda", color: "black" }, { vehicle_name: "Honda", color: "red" }, { vehicle_name: "Ford", color: "yellow" }, { vehicle_name: "Toyota", color: "white" } ] } ]
Given the array of obj above, My goal is to get the total number of vehicle in each key. Note: if the vehicle_name is repeated it should only count as 1. Expected Output:
const result = [ { a: { count: 2 } }, { b: { count: 3 } } ]
Explanation: The count of key a => is 2 because although it have 4 vehicles but Toyota is repeated so it only count as 1. Same goes in key b => the count is 3 because it has three different name(Honda, Ford, Toyota)
Advertisement
Answer
You can use map
to iterate the objects in vehicle
, then Object.entries
to iterate those objects, using reduce
to count the unique vehicles seen in the objects in each array value:
const vehicle = [ { a: [ { vehicle_name: "Toyota", color: "black" }, { vehicle_name: "Toyota", color: "red" }, { vehicle_name: "Ford", color: "yellow" }, { vehicle_name: "Toyota", color: "white" } ] }, { b: [ { vehicle_name: "Honda", color: "black" }, { vehicle_name: "Honda", color: "red" }, { vehicle_name: "Ford", color: "yellow" }, { vehicle_name: "Toyota", color: "white" } ] } ] const result = vehicle.map(o => Object.fromEntries( Object.entries(o).map(([k, a]) => [k, { count : a.reduce((acc, { vehicle_name }) => { if (!(vehicle_name in acc)) { acc[vehicle_name] = 1 acc.count++ } return acc }, { count: 0 }).count } ]) ) ) console.log(result)