J'apprends JavaScript et AngularJS.
Quelle est la différence entre ce code?
function isInArrayNgForeach(field, arr) {
angular.forEach(arr, function(value, key) {
if(field == value)
return true;
});
return false;
} // This returns always false
function isInArrayJavaScript(field, arr) {
for(var i = 0; i < arr.length; i++) {
if(field == arr[i])
return true;
}
return false;
} // This works fine
function isInArray() {
var testArr = ['stack', 'over', 'flow'];
console.log(isInArrayNgForeach('stack', testArr)); // return false
console.log(isInArrayJavaScript('stack', testArr)); // return true
}
Ma question est la suivante: pourquoi isInArrayNgForeach renvoie toujours false? Je suppose que parce qu'il y a une fonction à l'intérieur de la fonction, mais je ne sais pas pourquoi.
La première option est différente car return true;
revient de la fonction qui est passée en paramètre à la fonction forEach
et non de la fonction externe isInArrayNgForeach
. C'est pourquoi la dernière ligne return false;
est appelée toujours à la fin du forEach. Ce qui rend toujours la fonction false.
Si vous changez le code de cette façon, tt retournera le résultat attendu:
function isInArrayNgForeach(field, arr) {
var result = false;
angular.forEach(arr, function(value, key) {
if(field == value)
result = true;
});
return result;
}
function isInArrayNgForeach(field, arr) {
angular.forEach(arr, function(value, key) {
if(field == value)
return true; // You are returning the immediate function here not isInArrayNgForeach
...
Pour que cela fonctionne comme vous l'entendez
function isInArrayNgForeach(field, arr) {
var result = false;
angular.forEach(arr, function(value, key) {
if(field == value)
result = true;
});
return result;
} // This returns expected value
Dans la fonction isInArrayNgForeach
, vous retournez true
à la fonction anonyme donnée à forEach
. Cela ne passera jamais à isInArrayNgForeach
. Et enfin, vous dites return false
qui sera toujours renvoyé.
C'est comme
function isInArrayNgForeach(field, arr) {
//do something except return
return false;
} // So it will always return false
Si vous voulez accomplir ce que vous faites dans votre deuxième fonction, la variable some
en javascript vous aidera.
function isInArrayNgForeach(field, arr) {
return arr.some(function(element){return element==field});
//it will check if any element is equal to field it will return true otherwise false
}
Pour les primitives, vous pouvez toujours utiliser array.indexOf ...
var arr = ['foo', 'bar', 0, 22];
if (arr.indexOf('bar') > -1) {
// 'bar' is in arr
}