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!
}
});
}
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;
}
docs から:
コールバック関数がfalseを返すようにすることで、特定の反復で$ .each()ループを中断できます。 false以外を返すことは、forループのcontinueステートメントと同じです。すぐに次の反復にスキップします。
ここに :
http://jsbin.com/ucuqot/3/edit
function findXX(Word)
{
$.each(someArray, function(i,n)
{
$('body').append('-> '+i+'<br />');
if(n == Word)
{
return false;
}
});
}
変更済み$.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){
...
これを試して ...
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!
}
}
}
「コールバック関数に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