Найдите значение в массиве, затем верните 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? Я предполагаю, что, поскольку внутри функции есть функция, но я не уверен, почему.
Ответы
Ответ 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
}