Jquery each - остановить цикл и вернуть объект - PullRequest
58 голосов
/ 22 ноября 2011

Кто-нибудь может мне сказать, почему цикл не остановился после 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!
    }   
  });  
}

Заранее спасибо!

Ответы [ 5 ]

134 голосов
/ 22 ноября 2011

Потому что, когда вы используете оператор 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 - это то же самое, что продолжить оператор в цикле for; он сразу перейдет к следующему итерации.

2 голосов
/ 22 ноября 2011

здесь:

http://jsbin.com/ucuqot/3/edit

function findXX(word)
{  
  $.each(someArray, function(i,n)
  {
    $('body').append('-> '+i+'<br />');
    if(n == word)
    {
      return false;
    }   
  });  
}
1 голос
/ 09 февраля 2016

модифицированная $.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){
    ...
0 голосов
/ 01 мая 2019

"Мы можем разорвать цикл $ .each () на определенной итерации, сделав функцию обратного вызова возвращающей false. Возвращение не-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>

Еще немного с комментариями:

function findXX(myA, word) {
  let br = '<br />';//create once
  let myHolder = $("<div />");//get a holder to not hit DOM a lot
  let found = false;//default return
  $.each(myA, function(index, value) {
    found = (value == word);
    myHolder.append('-> ' + index + ":" + value + br);
    return !found;
  });
  $('body').append(myHolder.html());// hit DOM once
  return found;
}
$(function() {
  // no horrid global array, easier array setup;
  let someArray = ['t5', 'z12', 'b88', 's55', 'e51', 'o322', 'i22', 'k954'];
  // pass the array and the value we want to find, return back a value
  let test = findXX(someArray, 'o322');
  $('body').append("<div>Found:" + test + "</div>");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

ПРИМЕЧАНИЕ: массив .includes() может лучше подойти здесь https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes

Или просто .find(), чтобы получить это https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

0 голосов
/ 05 мая 2015

Попробуйте это ...

  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!
    }   
  }
}
...