2015-07-27 4 views
1
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 на части и проверить, равны они или нет. В то время как я делал это, интересно, даже если значения равны, он вычисляет , если утверждение истинно и увеличивает счет. Вот мой тест:если оператор неправильно вычисляет

ipsBetween ("10.0.0.0", "10.0.0.50")

Этот тест возвращает 4, в то время как он должен возвращать 1. Я не знаю, почему это происходит. I implicity посмотрел значения start.split ('.'). Slice (i, i + 1) и end.split ('.'). Slice (i, i + 1) и первые три элемента кажется равным.

ответ

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

Причина заключается в том, что оператор != когда сравнивающие два списка объектов вернутся true, если они не тот же объект: split возвращает список строк, но slice(i, i+1) будет возвращать список длины 1.

Это означает, что вы сравниваете ["10"] с другим ["10"] и они Два разных объекта списка, поэтому != будет r это верно.

Если вы просто сравниваете содержимое, используя x.slice(".")[i] вместо slice, то результат - это то, что вы ожидали.

PS: Оператор != из Javascript ужасен, и вы не должны его использовать и вместо этого предпочитаете !==. В этом случае было бы одинаково, но работать с ним гораздо лучше, потому что он не делает сумасшедших вещей, когда эти два типа отличаются.

PS2: Кажется хорошей идеей разделить строки на каждой итерации?

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")); 

Проблема заключается в массиве возвращаемых объектов не будет равен друг друга, потому что они не являются таким же массивом т. они не расположены в одном месте в памяти ...

Смежные вопросы