From db90b833b996885037f480306a02c7df4d18bb0b Mon Sep 17 00:00:00 2001 From: Fahim Faisaal Date: Tue, 1 Mar 2022 23:16:36 +0600 Subject: [PATCH 1/2] resolved: upgrade the algoritm --- String/CheckWordOccurrence.js | 25 +++++++++---------- String/test/CheckWordOcurrence.test.js | 34 ++++++++++++-------------- 2 files changed, 26 insertions(+), 33 deletions(-) diff --git a/String/CheckWordOccurrence.js b/String/CheckWordOccurrence.js index b86150c0be..037edd3e87 100644 --- a/String/CheckWordOccurrence.js +++ b/String/CheckWordOccurrence.js @@ -1,25 +1,22 @@ -/** - * Check and count occurrence of each word in a string - * Inputs a String eg. Madonna and Boolean - **/ - 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, occurrence + ), + {} + ) } + export { checkWordOccurrence } diff --git a/String/test/CheckWordOcurrence.test.js b/String/test/CheckWordOcurrence.test.js index 0779e0d29f..1025625f89 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) }) }) From c7196607ac350c5a7ab2d22df2de0b504b820714 Mon Sep 17 00:00:00 2001 From: Fahim Faisaal Date: Tue, 1 Mar 2022 23:23:48 +0600 Subject: [PATCH 2/2] docs: add js doc --- String/CheckWordOccurrence.js | 14 +++++++++++--- String/test/CheckWordOcurrence.test.js | 8 ++++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/String/CheckWordOccurrence.js b/String/CheckWordOccurrence.js index 037edd3e87..c024d2b597 100644 --- a/String/CheckWordOccurrence.js +++ b/String/CheckWordOccurrence.js @@ -1,3 +1,10 @@ +/** + * @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') @@ -12,9 +19,10 @@ const checkWordOccurrence = (str, isCaseSensitive = false) => { return modifiedStr .split(/\s+/) // remove all spaces and distribute all word in List .reduce( - (occurrence, word) => ( - occurrence[word] = occurrence[word] + 1 || 1, occurrence - ), + (occurrence, word) => { + occurrence[word] = occurrence[word] + 1 || 1 + return occurrence + }, {} ) } diff --git a/String/test/CheckWordOcurrence.test.js b/String/test/CheckWordOcurrence.test.js index 1025625f89..ab699662eb 100644 --- a/String/test/CheckWordOcurrence.test.js +++ b/String/test/CheckWordOcurrence.test.js @@ -3,7 +3,7 @@ import { checkWordOccurrence } from '../CheckWordOccurrence' describe('Testing checkWordOccurrence', () => { it('expects throw on insert wrong string', () => { const value = 123 - + expect(() => checkWordOccurrence(value)).toThrow() }) @@ -14,14 +14,14 @@ describe('Testing checkWordOccurrence', () => { }) it('check occurrence with case sensitive', () => { - const stringToTest = "The quick brown fox jumps over the lazy dog" + 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 = "The quick brown fox jumps over the lazy dog" + 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)