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);
}
}
Run Code Online (Sandbox Code Playgroud)
我在一个我正在审核的网络应用程序中找到了这个,它只是让我困惑,为什么它在那里.我似乎无法看到一个i!=a.indexOf(a.charAt(i))错误的案例.
传递给它的值是:
a = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
Run Code Online (Sandbox Code Playgroud)
无论是叹息还是没有评论
对于重复的字符,这是正确的,因为indexOf找到字符串的第一个索引,并且您从最后搜索.例:
var a = "xyzxyz";
Run Code Online (Sandbox Code Playgroud)
在第一次迭代时,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)将始终被算法覆盖,即不包含任何重复.
与往常一样,遇到这种类型的东西时,应用提取方法重构将是使代码更清晰的好方法.(甚至比评论它更好!)所以如果你把它拉出来一个方法,那么代码就会变成a = removeDuplicateChars(a),每个人都会更开心.
| 归档时间: |
|
| 查看次数: |
448 次 |
| 最近记录: |