在数组中查找值,然后使用Angular forEach返回true

时间:2014-07-31 14:17:08

标签: javascript angularjs 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 ?我假设因为函数内部有一个函数,但我不确定原因。

4 个答案:

答案 0 :(得分:31)

第一个选项是不同的,因为return true;从作为参数传递给forEach函数的函数返回而不是从外部函数isInArrayNgForeach返回,这就是为什么最后一行{{1}在forEach完成时总是被调用。这使得函数总是返回false。

如果你改变这样的代码,tt将返回预期的结果:

return false;

答案 1 :(得分:4)

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

答案 2 :(得分:1)

在函数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
}

答案 3 :(得分:0)

对于原语,您仍然可以使用array.indexOf ...

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