【问题标题】:Find value in array then return true with Angular forEach在数组中查找值,然后使用 Angular forEach 返回 true
【发布时间】:2014-09-23 12:52:53
【问题描述】:

我正在学习 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?我假设是因为函数内部有一个函数,但我不确定为什么。

【问题讨论】:

    标签: javascript angularjs foreach


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢(详细解释&&示例代码)
    • 设置result=true后,你应该return,否则即使在匹配之后它也会对每个元素进行迭代。
    【解决方案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 
        }
        

        【讨论】:

          猜你喜欢
          • 2015-06-29
          • 2016-11-05
          • 2019-09-09
          • 2017-11-27
          • 1970-01-01
          • 2014-11-11
          • 2020-09-12
          • 1970-01-01
          • 2021-12-12
          相关资源
          最近更新 更多