From 55f502e1f1583063c0f835c1072e75c65dd851ef Mon Sep 17 00:00:00 2001 From: Sandra Laguna <73791262+sandra-laguna@users.noreply.github.com> Date: Wed, 19 Oct 2022 13:22:27 +0200 Subject: [PATCH] algorithm: count letters (#1164) --- String/CountLetters.js | 33 ++++++++++++++++++++++++++++++++ String/test/CountLetters.test.js | 33 ++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 String/CountLetters.js create mode 100644 String/test/CountLetters.test.js diff --git a/String/CountLetters.js b/String/CountLetters.js new file mode 100644 index 000000000..6b6400150 --- /dev/null +++ b/String/CountLetters.js @@ -0,0 +1,33 @@ +/** + * @function countLetters + * @description Given a string, count the number of each letter. + * @param {String} str - The input string + * @return {Object} - Object with letters and number of times + * @example countLetters("hello") => {h: 1, e: 1, l: 2, o: 1} + */ + +const countLetters = (str) => { + const specialChars = /\W/g + + if (typeof str !== 'string') { + throw new TypeError('Input should be a string') + } + + if (specialChars.test(str)) { + throw new TypeError('Input must not contain special characters') + } + + if (/\d/.test(str)) { + throw new TypeError('Input must not contain numbers') + } + + const obj = {} + for (let i = 0; i < str.toLowerCase().length; i++) { + const char = str.toLowerCase().charAt(i) + obj[char] = (obj[char] || 0) + 1 + } + + return obj +} + +export { countLetters } diff --git a/String/test/CountLetters.test.js b/String/test/CountLetters.test.js new file mode 100644 index 000000000..424dcfa31 --- /dev/null +++ b/String/test/CountLetters.test.js @@ -0,0 +1,33 @@ +import { countLetters } from '../CountLetters' + +describe('CountLetters', () => { + it('expect throws on use wrong param', () => { + expect(() => countLetters(0)).toThrow() + }) + + it('expect throws when using a number in the string', () => { + expect(() => countLetters('h3llo')).toThrow() + }) + + it('expect throws when using a special characters in the string', () => { + expect(() => countLetters('hello!')).toThrow() + }) + + it('count the letters in a string. Allows lower case', () => { + const value = 'hello' + const count = countLetters(value) + expect(count).toEqual({ h: 1, e: 1, l: 2, o: 1 }) + }) + + it('count the letters in a string. Allows upper case', () => { + const value = 'HELLO' + const count = countLetters(value) + expect(count).toEqual({ h: 1, e: 1, l: 2, o: 1 }) + }) + + it('count the letters in a string. Allows upper and lower case', () => { + const value = 'HelLo' + const count = countLetters(value) + expect(count).toEqual({ h: 1, e: 1, l: 2, o: 1 }) + }) +})