2017-02-16 5 views
0

Я хочу проверить, является ли строка одинаковой от объекта массива или нет до отправки в форму таблицы, но она может быть такой же, если вы ничего не изменили в зоне редактирования. Пользователь заполнит форму таблицы и отправит ее на сервер, в следующий раз, если пользователь отредактирует форму, я хочу проверить, совпадают ли значения с массивом (который хранит предыдущие данные из таблицы), но это нормально, если пользователь не сделал этого, t изменить что-либо, кроме входа в зону редактирования. Проблема заключается в том, что мой код проверял, что нет такой же строки, но появляется всплывающее сообщение с истинным или ложным предупреждением, оно всплывает каждое сообщение, проверяя форму таблицы и переходя в инструкцию «false», поэтому я могу ничего не отправлять после проверки строки. Буду признателен за любую помощь, THX! :)Строка, сравниваемая для цикла

var arr = [{words: a},{words: b},{words: c},{words: d}]; 
var val = $('#somethingFromHTML').val() 
    for(var i = 0; i < arr.length; i++) { 
     if (arr[i].words.indexOf(val) > -1){ 
      alert("duplicate words") 
      return false 
     } else if (arr[i].words.indexOf(val) === -1 || arr[i].words === val){ 
      alert("there's no duplicate words") 
      return true 
     } 
    } 

ответ

1

Вы код всегда возвращает результат проверки только arr[0].words, она никогда не переходит к arr[1].words на всех, потому что

  • Вы в оба ваших if блоков в return и

  • Ваше второе состояние if является, отчасти, инверсным для первого

Следовательно, если val в arr[0].words (indexOf возвращает > -1), код возврата false. В противном случае он вернет true, потому что по определению indexOf возвращено -1, а ваше второе условие - «если это -1 или ...». Вторая часть или не имеет значения, потому что первая часть будет правдой.

Минимальное изменение поставить return trueпосле цикла:

var arr = [{words: a},{words: b},{words: c},{words: d}]; 
var val = $('#somethingFromHTML').val(); 
for(var i = 0; i < arr.length; i++) { 
    if (arr[i].words.indexOf(val) > -1){ 
     alert("duplicate words"); 
     return false; 
    } 
} 
alert("there's no duplicate words"); 
return true; 

... но массивы имеют функцию только для этой ситуации: Array.prototype.some:

var arr = [{words: a},{words: b},{words: c},{words: d}]; 
var val = $('#somethingFromHTML').val(); 
if (arr.some(function(entry) { entry.words.indexOf(val) > -1})) { 
    alert("duplicate words"); 
    return false; 
} else { 
    alert("there's no duplicate words"); 
    return true; 
} 

some называет его обратный вызов с элементами в массиве, по порядку, пока обратный вызов не вернет правное значение. Если обратный вызов когда-либо делает это, some возвращает true; если он достигнет конца массива с обратным вызовом, никогда не вернувшим правдивое значение, он возвращает false. Поэтому полезно проверить, соответствует ли какая-либо запись в массиве условию.

+0

Thx много, я что-то выясняю! :) –