This is not bad at all. A few things can be simplified a bit. --- Instead of iterating this way: > for(var i = 0; i < arr.length; i++){ You can do it like this: for (var i in arr) { The `i` loop variable will take on exactly the same values as your original loop, but this writing style is shorter, and more natural. --- When checking if `arr[i]` exists in `numMapping`: > if(numMapping[arr[i]] === undefined){ A simpler and more natural way is this: if (!(arr[i] in numMapping)) { --- As a tiny optimization, instead of this: > if (!(arr[i] in numMapping)) { > numMapping[arr[i]] = 0; > } > numMapping[arr[i]] += 1; This is somewhat better: if (!(arr[i] in numMapping)) { numMapping[arr[i]] = 1; } else { numMapping[arr[i]] += 1; } Because this way you save one extra lookup of `arr[...]` and also `numMapping[...]`, by directly assigning 1 instead of 0 and then incrementing later. --- At a few places the indentation was off, and I would recommend a bit more generous spaces in `if(...){` and `for(...){` statements, use `if (...) {` and `for (...) {` instead (like in my examples above).