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.