每个jQuery-停止循环并返回对象


68

有人可以告诉我为什么循环在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!
    }   
  });  
}

您确定这是真的if(someArray [i] =='someArray')
zaoudis 2011年

3
我认为这种情况(someArray [i] =='someArray')应该是(someArray [i] ==单词)
Irfan

1
@ user970727看看我的回答。它在每个命令中都使用集成函数(i,n)
Royi Namir

Answers:


156

因为当您returneach循环内使用语句时,“ non-false”值将充当a continue,而false将充当a break。您将需要falseeach函数中返回。像这样:

function findXX(word) {
    var toReturn; 
    $.each(someArray, function(i) {
        $('body').append('-> '+i+'<br />');
        if(someArray[i] == word) {
            toReturn = someArray[i];
            return false;
        }   
    }); 
    return toReturn; 
}

文档

通过使回调函数返回false,可以在特定的迭代中破坏$ .each()循环。返回非false与for循环中的continue语句相同;它将立即跳至下一个迭代。


1
你为什么不使用集成 function(i,n)
罗伊·纳米尔

因为我只是使用了OP在问题中发布的代码并更改了代码return
James Allardice 2011年

@ user970727-在该示例中,您根本没有循环中的return语句each...这是一个更新的示例:jsbin.com/ucuqot/5/edit
James Allardice 2011年

1
@JamesAllardice在“ return = false;”下对我不起作用。它正在退出循环,但是稍后传播到语句“ return toReturn;”。在我的情况下,我返回的是“ true”。因此即使执行了“ return = false”,也总是返回true
pavan kumar

为什么会这样呢?您会认为,返回某个值将意味着退出循环。
kiwicomb123 '17


2

修改$.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

尝试这个 ...

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

0

“通过使回调函数返回false,可以在特定的迭代中破坏$ .each()循环。返回非false与for循环中的continue语句相同;它将立即跳至下一个迭代。”

来自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>

还有更多评论:

注意:数组.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

与其设置标志,不如使用JavaScriptArray.prototype.find在数组中找到匹配的项,可能会更优雅。从回调返回真实值后,循环将结束,并且在迭代期间的数组值将成为.find调用的返回值:

function findXX(word) {
    return someArray.find((item, i) => {
        $('body').append('-> '+i+'<br />');
        return item === word;
    }); 
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.