From eb748ae78dc16db1a759959ad9b53eb7aa347224 Mon Sep 17 00:00:00 2001 From: Fahim Faisaal <57553028+fahimfaisaal@users.noreply.github.com> Date: Wed, 2 Mar 2022 11:13:01 +0600 Subject: [PATCH] merge: Fixed `wordOccurrence` algorithm (#909) * resolved: upgrade the algoritm * docs: add js doc --- String/CheckWordOccurrence.js | 31 +++++++++++++---------- String/test/CheckWordOcurrence.test.js | 34 ++++++++++++-------------- 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/String/CheckWordOccurrence.js b/String/CheckWordOccurrence.js index b86150c0b..c024d2b59 100644 --- a/String/CheckWordOccurrence.js +++ b/String/CheckWordOccurrence.js @@ -1,25 +1,30 @@ /** - * Check and count occurrence of each word in a string - * Inputs a String eg. Madonna and Boolean - **/ - + * @function checkWordOccurrence + * @description - this function count all the words in a sentence and return an word occurrence object + * @param {string} str + * @param {boolean} isCaseSensitive + * @returns {Object} + */ const checkWordOccurrence = (str, isCaseSensitive = false) => { if (typeof str !== 'string') { throw new TypeError('The first param should be a string') } + if (typeof isCaseSensitive !== 'boolean') { throw new TypeError('The second param should be a boolean') } - const result = {} - if (str.length > 0) { - for (let i = 0; i < str.length; i++) { - const word = isCaseSensitive ? str[i] : str[i].toUpperCase() - if (/\s/.test(word)) continue - result[word] = (!result[word]) ? 1 : result[word] + 1 - } - } + const modifiedStr = isCaseSensitive ? str.toLowerCase() : str - return result + return modifiedStr + .split(/\s+/) // remove all spaces and distribute all word in List + .reduce( + (occurrence, word) => { + occurrence[word] = occurrence[word] + 1 || 1 + return occurrence + }, + {} + ) } + export { checkWordOccurrence } diff --git a/String/test/CheckWordOcurrence.test.js b/String/test/CheckWordOcurrence.test.js index 0779e0d29..ab699662e 100644 --- a/String/test/CheckWordOcurrence.test.js +++ b/String/test/CheckWordOcurrence.test.js @@ -1,33 +1,29 @@ import { checkWordOccurrence } from '../CheckWordOccurrence' -describe('checkWordOccurrence', () => { + +describe('Testing checkWordOccurrence', () => { it('expects throw on insert wrong string', () => { const value = 123 + expect(() => checkWordOccurrence(value)).toThrow() }) + it('expect throw on insert wrong param for case sensitive', () => { const value = 'hello' + expect(() => checkWordOccurrence(value, value)).toThrow() }) + it('check occurrence with case sensitive', () => { - const stringToTest = 'A Mad World' - const charsOccurrences = checkWordOccurrence(stringToTest, true) - const expectResult = { A: 1, M: 1, a: 1, d: 2, W: 1, l: 1, o: 1, r: 1 } - const occurrencesObjectKeys = Object.keys(charsOccurrences) - const expectObjectKeys = Object.keys(expectResult) - expect(occurrencesObjectKeys.length).toBe(expectObjectKeys.length) - expectObjectKeys.forEach(key => { - expect(expectResult[key]).toBe(charsOccurrences[key]) - }) + const stringToTest = 'The quick brown fox jumps over the lazy dog' + const expectResult = { The: 1, quick: 1, brown: 1, fox: 1, jumps: 1, over: 1, the: 1, lazy: 1, dog: 1 } + + expect(checkWordOccurrence(stringToTest)).toEqual(expectResult) }) + it('check occurrence with case insensitive', () => { - const stringToTest = 'A Mad World' - const charsOccurrences = checkWordOccurrence(stringToTest, false) - const expectResult = { A: 2, D: 2, L: 1, M: 1, O: 1, R: 1, W: 1 } - const occurrencesObjectKeys = Object.keys(charsOccurrences) - const expectObjectKeys = Object.keys(expectResult) - expect(occurrencesObjectKeys.length).toBe(expectObjectKeys.length) - expectObjectKeys.forEach(key => { - expect(expectResult[key]).toBe(charsOccurrences[key]) - }) + const stringToTest = 'The quick brown fox jumps over the lazy dog' + const expectResult = { the: 2, quick: 1, brown: 1, fox: 1, jumps: 1, over: 1, lazy: 1, dog: 1 } + + expect(checkWordOccurrence(stringToTest, true)).toEqual(expectResult) }) })