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!=a.indexOf(a.charAt(i))
为假的情况。
传递给它的值是:
a = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
也没有评论//叹息
最佳答案
这对于重复的字符是正确的,因为 indexOf
找到字符串的第一个索引,而您是从末尾开始搜索。示例:
var a = "xyzxyz";
在第一次迭代中,i === 4
、a.charAt(4) === "x"
和 a.indexOf("x ") === 0
。所以 4 !== 0
。
然后设置 a = a.substring(0, 4) + a.substring(5)
。调用 substring
包含在第一个索引中但不包含在最后一个索引中,这意味着在这种情况下 a = "xyz"+ "yz"
,所以我们删除了从字符串中复制 "x"
。
由于循环向后遍历,因此即使对于重复多次的字符,这也会继续起作用;您可以看到 a.substring(i + 1)
部分始终已被算法覆盖,即不包含任何重复项。
一如既往地遇到这种事情,应用extract 方法重构 将是使代码更清晰的好方法。 (甚至比评论它更好!)因此,如果您只是将其提取到一个方法中,代码可能会变成 a = removeDuplicateChars(a)
,每个人都会更开心。
关于javascript - 奇怪的 JavaScript 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6624499/