Каков эквивалент прототипа .any в JQuery?

В прототипе есть одна функция, называемая .any. Я хочу то же самое, что и в JQuery.

Мой прототип кода:

 if (item_name == '' || $R(1,ind).any(function(i){return($F("bill_details_"+i+"_narration") == item_name)})) {
     alert("This item already added.");
 }

Я хочу выполнить эквивалентную функцию с помощью JQuery.

Пожалуйста, помогите мне достичь желаемого результата. Спасибо в Advance..

Ответы

Ответ 1

Для IE 9+ он встроен:

Метод some() проверяет, прошел ли какой-либо элемент в массиве тест, реализованный предоставленной функцией.

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/some

[2, 4, 6, 8, 10].some(function(n) { return n > 5; });
// -> true (the iterator will return true on 6)

Для IE 8 и ниже:

Прототип any

[2, 4, 6, 8, 10].any(function(n) { return n > 5; });
// -> true (the iterator will return true on 6)

Вы можете использовать jQuery.grep:

jQuery.grep([2, 4, 6, 8, 10], function(n) { return n > 5; }).length > 0;
// -> true (as grep returns [6, 8, 10])

Подчеркивание _.any или _.some

_.any([2, 4, 6, 8, 10], function(n) { return n > 5; });
// -> true (the iterator will return true on 6)

Ответ 2

ES5 имеет встроенную функцию Array.prototype.some, которая проверяет, соответствует ли какой-либо элемент в массиве предикатной функции, и которая останавливается итерация, как только найден соответствующий элемент.

.some(function(el) {
    return el.value === item_name;
});

Ваша проблема тогда просто становится одним из создания массива желаемых элементов, что сложнее, чем в Prototype, потому что в jQuery нет оператора "range". К счастью, $.map выполняет итерацию по пустым элементам, хотя встроенный Array.prototype.map не позволяет использовать new Array(ind):

var found = $.map(new Array(ind), function(_, x) {
    return "bill_details_" + (x + 1) + "_narration";
}).some(function(id) {
    var el = document.getElementById(id);
    return el && (el.value === item_name);
});

В приведенной выше ссылке имеется прокладка для .some для старых браузеров.

Ответ 3

JQuery имеет . is() метод, из документации: Check the current matched set of elements against a selector, element, or jQuery object and return *true* if at least one of these elements matches the given arguments. Таким образом, эквивалентный код:

 if (item_name == '' || $([1,ind]).is(function(i) { return $('#bill_details_'+i+'_narration').attr('name') == item_name; })) {
      alert("This item already added.");
 }

Ответ 4

Кажется, http://api.jquery.com/jQuery.grep/ - это то, что вы ищете.

попробовать

if (item_name == '' || $.grep([1,ind],function(i){return($("#bill_details_"+i+"_narration").attr("name") == item_name)}).length>0) {
     alert("This item already added.");
 }

Ответ 5

Согласно документации JQuery, если вы вернете ложь в функцию обратного вызова, она сломает цикл:

Мы можем разбить цикл $.each() на конкретной итерации, заставив функцию обратного вызова вернуть false. Возврат не-false - это то же самое, что и оператор continue в цикле for; он немедленно перейдет к следующей итерации.

Взято из: http://api.jquery.com/jquery.each/