मान लीजिए हमारे पास एक दो-आयामी सरणी है जिसमें कुछ रंगों और फलों के बारे में डेटा है, जैसे:
const data = [ ['orange', 'fruit'], ['red', 'color'], ['green', 'color'], ['orange', 'color'], ['banana', 'fruit'], ['blue', 'color'], ['lemon', 'fruit'], ['mango', 'fruit'], ['lemon', 'color'], ];
हमें एक फ़ंक्शन लिखना है जो इस सरणी को लेता है और एक ऐसी सरणी लौटाता है जिसमें विभिन्न फल और रंग उनकी श्रेणियों के अनुसार समूहित हों।
इस उदाहरण में हमारे पास केवल दो श्रेणियाँ हैं - 'fruit' और 'color', इसलिए आउटपुट में दो ऑब्जेक्ट की सरणी होनी चाहिए:
[
{
group: 'fruit',
value: ['orange', 'banana', 'lemon', 'mango']
},
{
group: 'color',
value: ['red', 'green', 'orange', 'blue', 'lemon']
}
]
नोट - इस उदाहरण में केवल दो श्रेणियाँ हैं, लेकिन हमें एक ऐसा समाधान लिखना है जो गतिशील संख्या में श्रेणियों के लिए काम करे, न कि केवल दो के लिए।
समाधान
हम Array.prototype.reduce() मेथड का उपयोग करेंगे। प्रत्येक उप-सरणी के लिए हम जाँचेंगे कि क्या वह समूह पहले से मौजूद है। यदि हाँ, तो हम उसके value गुण में नया मान जोड़ देंगे; अन्यथा हम उस समूह के लिए एक नया ऑब्जेक्ट बनाकर सरणी में जोड़ देंगे।
उदाहरण
const data = [
['orange', 'fruit'],
['red', 'color'],
['green', 'color'],
['orange', 'color'],
['banana', 'fruit'],
['blue', 'color'],
['lemon', 'fruit'],
['mango', 'fruit'],
['lemon', 'color'],
];
const groupData = arr => {
return arr.reduce((acc, val) => {
const [value, groupName] = val;
const groupIndex = acc.findIndex(el => el?.group === groupName);
if (groupIndex !== -1) {
acc[groupIndex].value.push(value);
} else {
acc.push({
group: groupName,
value: [value]
});
}
return acc;
}, []);
};
console.log(groupData(data));
आउटपुट
कंसोल में आउटपुट होगा:
[
{ group: 'fruit', value: ['orange', 'banana', 'lemon', 'mango'] },
{ group: 'color', value: ['red', 'green', 'orange', 'blue', 'lemon'] }
]