Подтвердить что ты не робот

Найдите значение в массиве, затем верните true с помощью Angular forEach

Я изучаю JavaScript и AngularJS.

Какая разница между этим кодом?

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
}

Мой вопрос: почему isInArrayNgForeach всегда возвращает false? Я предполагаю, что, поскольку внутри функции есть функция, но я не уверен, почему.

4b9b3361

Ответ 1

Первый вариант отличается от того, что return true; возвращается из функции, которая передается как параметр функции forEach не из внешней функции isInArrayNgForeach, и почему последняя строка return false; вызывается всегда, когда forEach заканчивается, Это всегда возвращает функцию false.

Если вы измените такой код, tt вернет ожидаемый результат:

function isInArrayNgForeach(field, arr) {
    var result = false;

    angular.forEach(arr, function(value, key) {
        if(field == value)
            result = true;
    });

    return result;
}

Ответ 2

function isInArrayNgForeach(field, arr) {
    angular.forEach(arr, function(value, key) {
        if(field == value)
            return true; // You are returning the immediate function here not isInArrayNgForeach
   ...

Чтобы он работал так, как вы его намереваетесь

function isInArrayNgForeach(field, arr) {
    var result = false;
    angular.forEach(arr, function(value, key) {
        if(field == value)
            result = true;
    });
    return result;
} // This returns expected value

Ответ 3

В функции isInArrayNgForeach вы возвращаете true в анонимную функцию, указанную в forEach. Он никогда не перейдет к isInArrayNgForeach. И, наконец, вы говорите return false, который всегда будет возвращен.

Это похоже на

function isInArrayNgForeach(field, arr) {
    //do something except return
    return false;
} // So it will always return false

Если вы хотите достичь того, что вы делаете в своей второй функции, вам поможет родной язык javascript some.

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
}

Ответ 4

Для примитивов вы все равно можете просто использовать array.indexOf...

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