--- id: 5e4ce2bbac708cc68c1df25f title: Letter frequency challengeType: 5 forumTopicId: 385263 dashedName: letter-frequency --- # --description-- Given a string, calculate the frequency of each character. All characters should be counted. This includes lower and upper case letters, digits, whitespace, special characters, or any other distinct characters. # --instructions-- Write a function to count the occurrences of each character in a given string. The function should return a 2D array with each of the elements in the following form: `['char', freq]`. The character should be a string with a length of 1, and frequency is a number denoting the count. For example, given the string "ab", your function should return `[['a', 1], ['b', 1]]`. # --hints-- `letterFrequency` should be a function. ```js assert(typeof letterFrequency == 'function'); ``` `letterFrequency("Not all that Mrs. Bennet, however")` should return an array. ```js assert(Array.isArray(letterFrequency('Not all that Mrs. Bennet, however'))); ``` `letterFrequency("Not all that Mrs. Bennet, however")` should return `[[" ", 5], [",", 1], [".", 1], ["B", 1], ["M", 1], ["N", 1], ["a", 2], ["e", 4], ["h", 2], ["l", 2], ["n", 2], ["o", 2], ["r", 2], ["s", 1], ["t", 4], ["v", 1], ["w", 1]]`. ```js assert.deepEqual(letterFrequency('Not all that Mrs. Bennet, however'), [ [' ', 5], [',', 1], ['.', 1], ['B', 1], ['M', 1], ['N', 1], ['a', 2], ['e', 4], ['h', 2], ['l', 2], ['n', 2], ['o', 2], ['r', 2], ['s', 1], ['t', 4], ['v', 1], ['w', 1] ]); ``` `letterFrequency("daughters, could ask on the ")` should return `[[" ", 5],[",", 1],["a", 2],["c", 1],["d", 2],["e", 2],["g", 1],["h", 2],["k", 1],["l", 1],["n", 1],["o", 2],["r", 1],["s", 2],["t", 2],["u", 2]]`. ```js assert.deepEqual(letterFrequency('daughters, could ask on the '), [ [' ', 5], [',', 1], ['a', 2], ['c', 1], ['d', 2], ['e', 2], ['g', 1], ['h', 2], ['k', 1], ['l', 1], ['n', 1], ['o', 2], ['r', 1], ['s', 2], ['t', 2], ['u', 2] ]); ``` `letterFrequency("husband any satisfactory description")` should return `[[" ", 3], ["a", 4], ["b", 1], ["c", 2], ["d", 2], ["e", 1], ["f", 1], ["h", 1], ["i", 3], ["n", 3], ["o", 2], ["p", 1], ["r", 2], ["s", 4], ["t", 3], ["u", 1], ["y", 2]]`. ```js assert.deepEqual(letterFrequency('husband any satisfactory description'), [ [' ', 3], ['a', 4], ['b', 1], ['c', 2], ['d', 2], ['e', 1], ['f', 1], ['h', 1], ['i', 3], ['n', 3], ['o', 2], ['p', 1], ['r', 2], ['s', 4], ['t', 3], ['u', 1], ['y', 2] ]); ``` `letterFrequency("in various ways--with barefaced")` should return `[[" ", 3], ["-", 2], ["a", 4], ["b", 1], ["c", 1], ["d", 1], ["e", 2], ["f", 1], ["h", 1], ["i", 3], ["n", 1], ["o", 1], ["r", 2], ["s", 2], ["t", 1], ["u", 1], ["v", 1], ["w", 2], ["y", 1]]`. ```js assert.deepEqual(letterFrequency('in various ways--with barefaced'), [ [' ', 3], ['-', 2], ['a', 4], ['b', 1], ['c', 1], ['d', 1], ['e', 2], ['f', 1], ['h', 1], ['i', 3], ['n', 1], ['o', 1], ['r', 2], ['s', 2], ['t', 1], ['u', 1], ['v', 1], ['w', 2], ['y', 1] ]); ``` `letterFrequency("distant surmises; but he eluded")` should return `[[" ", 4], [";", 1], ["a", 1], ["b", 1], ["d", 3], ["e", 4], ["h", 1], ["i", 2], ["l", 1], ["m", 1], ["n", 1], ["r", 1], ["s", 4], ["t", 3], ["u", 3]]`. ```js assert.deepEqual(letterFrequency('distant surmises; but he eluded'), [ [' ', 4], [';', 1], ['a', 1], ['b', 1], ['d', 3], ['e', 4], ['h', 1], ['i', 2], ['l', 1], ['m', 1], ['n', 1], ['r', 1], ['s', 4], ['t', 3], ['u', 3] ]); ``` `letterFrequency("last obliged to accept the second-hand,")` should return `[[" ", 5], [",", 1], ["-", 1], ["a", 3], ["b", 1], ["c", 3], ["d", 3], ["e", 4], ["g", 1], ["h", 2], ["i", 1], ["l", 2], ["n", 2], ["o", 3], ["p", 1], ["s", 2], ["t", 4]]`. ```js assert.deepEqual(letterFrequency('last obliged to accept the second-hand,'), [ [' ', 5], [',', 1], ['-', 1], ['a', 3], ['b', 1], ['c', 3], ['d', 3], ['e', 4], ['g', 1], ['h', 2], ['i', 1], ['l', 2], ['n', 2], ['o', 3], ['p', 1], ['s', 2], ['t', 4] ]); ``` # --seed-- ## --seed-contents-- ```js function letterFrequency(txt) { } ``` # --solutions-- ```js function letterFrequency(txt) { var cs = txt.split(''), i = cs.length, dct = {}, c = '', keys; while (i--) { c = cs[i]; dct[c] = (dct[c] || 0) + 1; } keys = Object.keys(dct); keys.sort(); return keys.map(function (c) { return [c, dct[c]]; }); } ```