Quelqu'un peut-il me dire pourquoi la boucle ne s'est pas arrêtée après le 5
entrée?
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!
}
});
}
Parce que lorsque vous utilisez une instruction return
dans une boucle each
, une valeur "non fausse" agira comme un continue
, alors que false
agira comme un break
. Vous devrez retourner false
à partir de la fonction each
. Quelque chose comme ça:
function findXX(Word) {
var toReturn;
$.each(someArray, function(i) {
$('body').append('-> '+i+'<br />');
if(someArray[i] == Word) {
toReturn = someArray[i];
return false;
}
});
return toReturn;
}
De la docs :
Nous pouvons rompre la boucle $ .each () à une itération particulière en renvoyant la fonction de rappel à false. Renvoyer non-false est identique à une instruction continue dans une boucle for; il passera immédiatement à la prochaine itération.
ici :
http://jsbin.com/ucuqot/3/edit
function findXX(Word)
{
$.each(someArray, function(i,n)
{
$('body').append('-> '+i+'<br />');
if(n == Word)
{
return false;
}
});
}
modifié $.each
une fonction
$.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 ;
}
il cassera la boucle sur un résultat non-faux/non-vide et le renverra, donc dans votre cas, il serait
return $.eachReturn(someArray, function(i){
...
Essaye ça ...
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!
}
}
}
"Nous pouvons rompre la boucle $ .each () à une itération particulière en renvoyant la fonction de rappel à false. Renvoyer non-false équivaut à une instruction continue dans une boucle for; elle passera immédiatement à la prochaine itération."
de http://api.jquery.com/jquery.each/
Oui, c'est vieux MAIS, juste pour répondre à la question, cela peut être un peu plus simple:
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>
Un peu plus avec des commentaires:
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>
NOTE: le tableau .includes()
pourrait mieux convenir ici https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
Ou simplement .find()
pour obtenir cela https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find