Каков эквивалент прототипа .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/