web-dev-qa-db-ja.com

JQueryそれぞれ-ループを停止してオブジェクトを返す

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!
    }   
  });  
}
58
user970727

returnループ内でeachステートメントを使用すると、「偽でない」値がcontinueとして機能するのに対し、falsebreakfalse関数から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; 
}

docs から:

コールバック関数がfalseを返すようにすることで、特定の反復で$ .each()ループを中断できます。 false以外を返すことは、forループのcontinueステートメントと同じです。すぐに次の反復にスキップします。

136
James Allardice

ここに :

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

function findXX(Word)
{  
  $.each(someArray, function(i,n)
  {
    $('body').append('-> '+i+'<br />');
    if(n == Word)
    {
      return false;
    }   
  });  
}
2
Royi Namir

変更済み$.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){
    ...
1
Peter

これを試して ...

  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
sangeeth kumar

「コールバック関数にfalseを返すことで、特定の反復で$ .each()ループを中断できます。非falseを返すことは、forループのcontinueステートメントと同じです。次の反復にすぐにスキップします。」

from 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