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>