JavaScript Grouping Palabras por longitud
let str = 'Sleep is critical for good health. Not getting enough sleep can lead \
to diminished brain performance and, in the long term, greater risk of \
health conditions. These include heart disease, stroke, and diabetes';
function findWordsByLen(str, len) {
const punctuationReg = /[.:;,?!"`~[\]{}()<>/@#$%^&*=+_-]/g;
const words = str
.replaceAll(/\s{2,}/g, ' ')
.replaceAll(punctuationReg, '')
.split(' ');
let wordsByLen = words.reduce((acc, word) => {
let wordLen = word.length;
if (!acc.has(wordLen)) acc.set(wordLen, new Set());
acc.get(wordLen).add(word);
return acc;
}, new Map());
const maxLen = Math.max(...wordsByLen.keys());
const minLen = Math.min(...wordsByLen.keys());
switch(len) {
case 'all':
return wordsByLen;
case 'max':
return wordsByLen.get(maxLen);
case 'min':
return wordsByLen.get(minLen);
}
if (Number.isInteger(len) && wordsByLen.has(len)) return wordsByLen.get(len)
else return `The string doesn't have any words with a length of ${len}`
}
findWordsByLen(str, 'max'); // => Set(1) { 'performance' }
findWordsByLen(str, 'min'); // => Set(4) { 'is', 'to', 'in', 'of' }
findWordsByLen(str, 8); // => Set(2) { 'critical', 'diabetes' }
findWordsByLen(str, 'all');
/* OUTPUT:
Map(9) {
5 => Set(5) { 'Sleep', 'sleep', 'brain', 'These', 'heart' },
2 => Set(4) { 'is', 'to', 'in', 'of' },
8 => Set(2) { 'critical', 'diabetes' },
3 => Set(5) { 'for', 'Not', 'can', 'and', 'the' },
4 => Set(5) { 'good', 'lead', 'long', 'term', 'risk' },
6 => Set(3) { 'health', 'enough', 'stroke' },
7 => Set(4) { 'getting', 'greater', 'include', 'disease' },
10 => Set(2) { 'diminished', 'conditions' },
11 => Set(1) { 'performance' }
}
*/
codeager