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)