I have an array of object that contains different key value pairs and I’m trying to reduce this array of object using an another array.
I can refer the array that need to be reduced as the “Reducible Array” and the array I’m using to reduce as “Key array”.
Reducible Array:
[
{
"movie": {
"title": "Avengers",
"universe": "MARVEL",
"owned": "Walt Disney"
}
},
{
"movie": {
"title": "Captain America",
"universe": "MARVEL",
"owned": "Walt Disney"
}
},
{
"movie": {
"title": "Justice League",
"universe": "DC",
"owned": "Warner Bros"
}
}
]
Key Array:
[DC, MARVEL]
The reduced array of object I’m expecting after the operation is as follows.
Expected Result:
[
{
"Universe": "MARVEL",
"OwnedBy": "Walt Disney"
},
{
"Universe": "DC",
"OwnedBy": "Warner Bros"
}
]
What are all the operations I need to perform to get the expected result?
Advertisement
Answer
Since you naturally felt to use the word reduce you must know that javascript offers such a method to reduce arrays:
const keyArray = ['DC', 'MARVEL'];
const array = [
{
"movie": {
"title": "Avengers",
"universe": "MARVEL",
"owned": "Walt Disney"
}
},
{
"movie": {
"title": "Captain America",
"universe": "MARVEL",
"owned": "Walt Disney"
}
},
{
"movie": {
"title": "Justice League",
"universe": "DC",
"owned": "Warner Bros"
}
}
];
const reducedObject = array.reduce((carry, {movie}) => {
const key = `${movie.universe}-${movie.owned}`;
if (keyArray.includes(movie.universe) && !carry.hasOwnProperty(key)) {
carry[key] = {universe: movie.universe, owned: movie.owned};
}
return carry;
}, {});
const reducedArray = Object.values(reducedObject);
console.log(reducedArray);