Given data
const data = [
{
dream: ["Bengali", "French"],
feel: ["Arabic", "English"],
speak: ["Afrikaans", "Armenian"],
think: ["Albanian"]
},
{
dream: ["English", "French"],
feel: ["German", "Italian"],
speak: ["Afrikaans", "English"],
think: ["Cantonese"]
}
];
First convert the array of category-languages arrays to a reduced object of category-language sets. The sets are used to remove duplicates.
const reducedData = data.reduce((categories, current) => {
// Loop over the categories (dream, feel, etc..)
// and add languages to sets
Object.entries(current).forEach(([currentCategory, languages]) => {
if (!categories[currentCategory]) {
// A set will not allow duplicate entires
categories[currentCategory] = new Set();
}
// Add all languages to the set
languages.forEach(language => categories[currentCategory].add(language));
});
return categories;
}, {});
You now have an object with shape
{
dream: Set("Bengali", "French", "English"),
feel: Set("Arabic", "English", "German", "Italian"),
speak: Set("Afrikaans", "Armenian", "English"),
think: Set("Albanian", "Cantonese"),
}
Then again reduce this to an object of category - languages array. This is simply converting the sets back to an array.
const reducedDataArray = Object.entries(reducedData).reduce(
(categories, [category, languageSet]) => {
// Convert Set back to an array
categories[category] = [...languageSet];
return categories;
},
{}
);
Result object shape
{
dream: ["Bengali", "French", "English"],
feel: ["Arabic", "English", "German", "Italian"],
speak: ["Afrikaans", "Armenian", "English"],
think: ["Albanian", "Cantonese"],
}
const data = [
{
dream: ["Bengali", "French"],
feel: ["Arabic", "English"],
speak: ["Afrikaans", "Armenian"],
think: ["Albanian"]
},
{
dream: ["English", "French"],
feel: ["German", "Italian"],
speak: ["Afrikaans", "English"],
think: ["Cantonese"]
}
];
const reducedData = data.reduce((categories, current) => {
Object.entries(current).forEach(([currentCategory, languages]) => {
if (!categories[currentCategory]) {
categories[currentCategory] = new Set();
}
languages.forEach(language => categories[currentCategory].add(language));
});
return categories;
}, {});
const reducedDataArray = Object.entries(reducedData).reduce(
(categories, [category, languageSet]) => {
categories[category] = [...languageSet];
return categories;
},
{}
);
console.log(reducedDataArray);