2015-07-23 2 views
0

Таким образом, в основном, у меня есть массив с ребенком массив, который выглядит как этотJQuery - проверить, если значение в массиве

var test = [['code', 'name'], ['code', 'name'], ['code', 'name'], ['code', 'name'], ['code', 'name']]; 

и у меня есть вход. После нажатия кнопки «Отправить» мне нужно проверить, уже ли введенное значение в массиве, и если да, отобразите сообщение об ошибке.

Я уже пробовал использовать этот код, но он не работает. Он не показывает ошибку

var value = labelInput.val(); 
if(jQuery.inArray(value, test) !== -1) { 
    labelInput.addClass("sp-validation-error"); 
} 
+1

Все дочерние элементы в тестовом массиве также является массивом. Таким образом, вам нужно пройти через каждый элемент в тестовом массиве, а затем вы можете сделать 'jQuery.inArray', чтобы узнать, существует ли значение вашего входного поля в массиве тестов или нет. Для ref [проверьте это] (https://api.jquery.com/jQuery.inArray/). – deepakb

+0

Возможный дубликат [array.contains (obj) в JavaScript] (http://stackoverflow.com/questions/237104/array-containsobj-in-javascript) –

ответ

1

Вы также можете сделать следующим образом с не петли.

var value = labelInput.val();  
if(test.join(",").match(new RegExp(value, "gi")) !== null) { 
    labelInput.addClass("sp-validation-error"); 
} 

Примечание: RegExp немного медленнее, чем indexOf. Таким образом, вы также можете использовать:

if(test.join(",").indexOf(value) !== -1) { 
    labelInput.addClass("sp-validation-error"); 
} 

A Demo

+0

спасибо, это сработало – SpeekaDievs

+0

, это, наверное, самый неустойчивый способ сделать это. если вы хотите использовать строку, просто используйте indexof, а не регулярное выражение, которое является полным переполнением – Alex

+0

@Alex. Я отредактировал свой ответ, чтобы разместить версию _perfomant_. Благодаря! – lshettyl

3

петля Только через дочерние массивы и использовать тот же метод:

var value = labelInput.val(), 
    found = false; 

for (var i = 0; i < test.length; i++) { 
    if (jQuery.inArray(value, test[i])) { 
    alert('found!'); 
    found = true; 
    break; 
    } 
} 

if (found) { 
    labelInput.addClass("sp-validation-error"); 
} 

Смотрите также .indexOf

+0

Я не совсем понимаю значение индексной переменной. Должен ли я определить его или должен ли этот код работать? – SpeekaDievs

+0

Этот код должен работать. Индексная переменная является представителем каждой итерации в тестовом массиве. Посмотрите на javascript для циклов. – Alex

+0

Не забудьте использовать '(индекс var в тесте)' в отличие от '(index in test)', поскольку вы не хотите создавать глобальную переменную! и это также [плохая идея] (http://stackoverflow.com/questions/500504/why-is-using-for-in-with-array-iteration-such-a-bad-idea) для использования 'for. .in' на массивах, а не 'for'. – lshettyl

2

Altough есть уже принял ответ, я чувствую, что есть еще более Elegent способом.

Вместо того чтобы присоединиться массив в строку и искать эту строку, вы можете также использовать один вкладыш с использованием some:

if (test.some(function(element) { return element.indexOf(value) !== -1 })) { 
    // do stuff 
} 
+0

конечно нет. ie8 старый и устаревший – Alex

+0

я знаю. вы можете использовать полипол или что угодно. ms потеряла поддержку ie8, поэтому мне больше не нужно больше беспокоиться :) https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/some#Polyfill – Alex