function ipsBetween(start, end){
var count = 0;
for(var i = 0; i < 4; i++) {
if(start.split('.').slice(i, i + 1) != end.split('.').slice(i, i + 1)) {
count++;
}
}
return count;
}
我试图在一个范围之间找到所有可能的IP。上面的代码只是一个开始。我试图将IP拆分并检查它们是否相等。虽然我这样做,但即使值相等,它也会将 if 语句评估为true并增加计数。这是我的测试用例:
ipsBetween(“10.0.0.0”,“10.0.0.50”)
这个测试用例返回4,而它应该返回1.我不知道为什么会这样。我看上去很明显的是 start.split('。')。slice(i,i + 1)和 end.split('。')。slice(i,i + 1)的值)并且前三个元素似乎相等。
答案 0 :(得分:2)
这里真的没有必要使用.slice()
。 (这就是导致问题的原因:.slice()
返回一个数组,两个不同的数组永远不会彼此相等。)首先拆分字符串,然后只使用数组索引:
var count = 0;
start = start.split("."); end = end.split(".");
for (var i = 0; i < start.length; ++i)
if (start[i] != end[i])
count++;
return count;
答案 1 :(得分:1)
原因是运算符!=
在比较两个列表对象时将返回true
如果它们不是同一个对象:split
返回字符串列表但slice(i, i+1)
}将返回长度为1的列表。
这意味着您要将["10"]
与另一个["10"]
进行比较,它们是两个不同的列表对象,因此!=
将返回true。
如果您只是使用x.slice(".")[i]
而不是使用slice
来比较内容,那么结果就是您所期望的。
PS:Javascript的运算符!=
非常糟糕,您不应该使用它而更喜欢!==
。在这种情况下它会是相同的,但它更好用,因为当两种类型不同时它不会做疯狂的事情。
PS2:在每次迭代时分割字符串似乎是一个好主意吗?
答案 2 :(得分:0)
您正在比较arrays
而不是strings
您希望比较string
值,请尝试这样做:
function ipsBetween(start, end){
var count = 0;
for(var i = 0; i < 4; i++) {
if(start.split('.').slice(i, i + 1)[0] != end.split('.').slice(i, i + 1)[0]) {
count++;
}
}
return count;
}
console.log(ipsBetween("10.0.0.0", "10.0.0.50"));
问题是返回的数组对象不会彼此相等,因为它们不是相同的数组即。它们不在记忆中的同一位置......