I recently wrote this JavaScript algorithm for removing duplicates from an array as part of a job interview process, but was turned down for the position after submitting the code. I didn't receive any detailed feedback from the company, so I was wondering if a more experienced developer might be able to explain what I've done wrong here.
dedup = function(set){ //loop over function, removing second instance of matching values for (var i = 0; i < set.length; i++){ for (var j = i+1; j < set.length; j++){ if (set[i] == set[j]){ set.splice(j,1); i--; } //special case for objects if (typeof set[j] == 'object' && typeof set[i] == 'object') { //super special case for arrays if (Array.isArray(set[j]) && (Array.isArray(set[i]))) { if ( set[j].toString() == set[i].toString() ) { set.splice(j,1); i-- } } //loop over key-value pairs in sets of objects else { var firstObj = set[i]; var secondObj = set[j]; for (var key in firstObj){ //break loop if differences found if (firstObj.hasOwnProperty(key) == false) { break } else if (firstObj[key] != secondObj[key]){ break } else { set.splice(j,1); i-- break } } } } } } return set } console.log(dedup([1, 2, 2, 5, 2, 7, 3, 9, 1, 9])) // -> [1, 2, 5, 7, 3, 9] console.log(dedup([1, '1', 2, 0, false, true])) // -> [1, '1', 2, 0, false, true] console.log(dedup([8, 3, [1, 2], [1, 2, 3], [1, 2], [2, 1], true])) // -> [8, 3, [1, 2], [1, 2, 3], [2, 1], true] console.log(dedup([1, {a: 'b', c: 'd'}, {c: 'd', a: 'b'}, {e: 'f'}, 'b'])) // -> [1, {a: 'b', c: 'd'}, {e: 'f'}, 'b']
I've found the following possible problems:
- Running time is \$\mathcal{O}(n^2)\$ - there may be a recursive algorithm which removes duplicates more effectively than nested for loops.
- Code should be refactored rather than all in on big function.
I would greatly appreciate any thoughts on the problems that I've identified, or other issues with my code.