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' }
}
*/