2
for (var i=a.length-1;i>0;i--) {
    if (i!=a.indexOf(a.charAt(i))) {
        a=a.substring(0,i)+a.substring(i+1);
    }
}

I found this in a web app I'm auditing, it just baffles me why it's there. I can't seem to see a case where i!=a.indexOf(a.charAt(i)) would be false.

The value the pass to it is:

a = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

There is no comment either //sigh

1 Answer 1

6

This would be true for repeated characters, since indexOf finds the first index of a string, and you're searching from the end. Example:

var a = "xyzxyz";

On first iteration, i === 4, a.charAt(4) === "x", and a.indexOf("x") === 0. So 4 !== 0.

It then sets a = a.substring(0, 4) + a.substring(5). Recalling at substring is inclusive in the first index but exclusive in the last index, that means in this case a = "xyz" + "yz", so we have removed the duplicate "x" from the string.

Since the loop traverses backward, this will continue to work even for characters repeated more than once; you can see that the portion a.substring(i + 1) will always have been covered by the algorithm already, i.e. not contain any duplicates.


As always when encountering this type of thing, applying the extract method refactoring would be a great way to make the code clearer. (Even better than commenting it!) So if you just pulled this out into a method, the code could become a = removeDuplicateChars(a), and everyone is much happier.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.