1
var countOfAtoms = function (formula) {2
function getElementCount(flatFormula) {3
const reElementCount = /([A-Z][a-z]*)(\d*)/g;4
let matches = flatFormula.matchAll(reElementCount);6
let output = new Map();8
for (let [match, element, count] of matches) {9
count = count === "" ? 1 : +count;11
if (output.has(element)) {12
output.set(element, output.get(element) + count);14
output.set(element, count);21
function flattenElementCount(elCountMap) {22
let arr = [...elCountMap.entries()].sort();24
return arr.reduce((str, item) => {25
let num = item[1] === 1 ? "" : item[1];26
return str + item[0] + num;30
function unnest(fullMatch, innerFormula, multiplier) {31
let elementCount = getElementCount(innerFormula);32
multiplier = multiplier === "" ? 1 : +multiplier;34
for (let [element, count] of elementCount) {35
elementCount.set(element, elementCount.get(element) * multiplier);38
return flattenElementCount(elementCount);41
function flattenFormula(formula) {42
const reNested = /\((\w+)\)(\d*)/g;44
while (reNested.test(formula)) {45
formula = formula.replaceAll(reNested, unnest);51
let flatFormula = flattenFormula(formula);53
return flattenElementCount(getElementCount(flatFormula));