web-dev-qa-db-fra.com

Trouver une valeur dans un tableau puis renvoyer true avec Angular pour chaque

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.

14
Kimchi Man

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;
}
31
David Bohunek
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
4
javaCity

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
}
1
Mritunjay

Pour les primitives, vous pouvez toujours utiliser array.indexOf ...

var arr = ['foo', 'bar', 0, 22];
if (arr.indexOf('bar') > -1) {
    // 'bar' is in arr 
}
0
user3664437