JQuery каждый - цикл Stop и возвращаемый объект
Кто-нибудь может сказать мне, почему цикл не остановился после записи 5
?
http://jsbin.com/ucuqot/edit#preview
$(document).ready(function()
{
someArray = new Array();
someArray[0] = 't5';
someArray[1] = 'z12';
someArray[2] = 'b88';
someArray[3] = 's55';
someArray[4] = 'e51';
someArray[5] = 'o322';
someArray[6] = 'i22';
someArray[7] = 'k954';
var test = findXX('o322');
});
function findXX(word)
{
$.each(someArray, function(i)
{
$('body').append('-> '+i+'<br />');
if(someArray[i] == 'someArray')
{
return someArray[i]; //<--- did not stop the loop!
}
});
}
Ответы
Ответ 1
Потому что, когда вы используете оператор return
внутри each
цикла, "не ложное" значение будет действовать как continue
, тогда как false
будет действовать как break
. Вам нужно будет вернуть false
из each
функции. Что-то вроде этого:
function findXX(word) {
var toReturn;
$.each(someArray, function(i) {
$('body').append('-> '+i+'<br />');
if(someArray[i] == word) {
toReturn = someArray[i];
return false;
}
});
return toReturn;
}
Из документов:
Мы можем разорвать цикл $.each() на определенной итерации, заставив функцию обратного вызова вернуть false. Возвращение non-false - это то же самое, что и оператор continue в цикле for; он сразу перейдет к следующей итерации.
Ответ 2
здесь:
http://jsbin.com/ucuqot/3/edit
function findXX(word)
{
$.each(someArray, function(i,n)
{
$('body').append('-> '+i+'<br />');
if(n == word)
{
return false;
}
});
}
Ответ 3
измененная $.each
функция
$.fn.eachReturn = function(arr, callback) {
var result = null;
$.each(arr, function(index, value){
var test = callback(index, value);
if (test) {
result = test;
return false;
}
});
return result ;
}
он будет прерывать цикл на не-ложный/непустой результат и вернуть его обратно, поэтому в вашем случае это будет
return $.eachReturn(someArray, function(i){
...
Ответ 4
Попробуйте это...
someArray = new Array();
someArray[0] = 't5';
someArray[1] = 'z12';
someArray[2] = 'b88';
someArray[3] = 's55';
someArray[4] = 'e51';
someArray[5] = 'o322';
someArray[6] = 'i22';
someArray[7] = 'k954';
var test = findXX('o322');
console.log(test);
function findXX(word)
{
for(var i in someArray){
if(someArray[i] == word)
{
return someArray[i]; //<--- stop the loop!
}
}
}
Ответ 5
"Мы можем разорвать цикл $.each() на определенной итерации, заставив функцию обратного вызова вернуть false. Возвращение non-false - это то же самое, что и оператор continue в цикле for; он сразу же пропустится до следующей итерации".
с http://api.jquery.com/jquery.each/
Да, это старое, НО, ПРОСТО, чтобы ответить на вопрос, это может быть немного проще:
function findXX(word) {
$.each(someArray, function(index, value) {
$('body').append('-> ' + index + ":" + value + '<br />');
return !(value == word);
});
}
$(function() {
someArray = new Array();
someArray[0] = 't5';
someArray[1] = 'z12';
someArray[2] = 'b88';
someArray[3] = 's55';
someArray[4] = 'e51';
someArray[5] = 'o322';
someArray[6] = 'i22';
someArray[7] = 'k954';
findXX('o322');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>