forEach in Angular过滤器不返回

时间:2017-04-05 08:47:38

标签: angularjs angularjs-filter

我有一个过滤器,可以将BPM整数转换为正确的拉丁语。

最初我对每个拉丁语都有一个if else语句,但现在我正在进行重构以使其更易于维护。

以下是我的想法:

angular.module('app').filter('latinTerm', function() {
    var terms = [
        {
            min: 0,
            max: 41,
            term: "Grave"
        },
        {
            min: 40,
            max: 60,
            term: "Largo"
        },
        {
            min: 59,
            max: 66,
            term: "Larghetto"
        }
    ]

    return function(value) {
        angular.forEach(terms, function(term) {
            if (value > term.min && value < term.max) {
                return value;
            }
        });
    }
});

但即使值在提供的值之间,这也不会返回任何内容。

在这种意义上,我使用的过滤器是错误的吗?或者它可以调整工作吗?

感谢。

3 个答案:

答案 0 :(得分:3)

当你需要打破循环并返回一些内容时,你不能使用forEach,因为它不会中断。您可以使用旧式 for循环来实现它。

引用Array.prototype.forEach | MDN

  

除了抛出异常之外,没有办法停止或中断forEach()循环。如果你需要这样的行为,forEach()方法是错误的工具,而是使用普通循环。

这样的事情:

angular.module('app').filter('latinTerm', function() {
    var terms = [
        {
            min: 0,
            max: 41,
            term: "Grave"
        },
        {
            min: 40,
            max: 60,
            term: "Largo"
        },
        {
            min: 59,
            max: 66,
            term: "Larghetto"
        }
    ]

    return function(value) {
        for(var i = 0; i < terms.length; i++) {
            if (value > terms[i].min && value < terms[i].max) {
                return value;
            }
        }
    }
});

答案 1 :(得分:2)

如果您仍然需要使用angular.forEach(它会发生),只需使用变量:

return function(value) {
    var returnValue;
    angular.forEach(terms, function(term) {
        if (value > term.min && value < term.max) {
            returnValue = value;
        }
    });
    return returnValue;
}

答案 2 :(得分:0)

你不能在foreach内部返回,因为它不会为每个内部而破坏。您可以做的一件事是根据条件或用于循环

为变量赋值

&#13;
&#13;
angular.module("app",[])
.controller("ctrl",function($scope){

$scope.values = [21,331,12,44,1111]
}).filter('latinTerm', function() {
    var terms = [
        {
            min: 0,
            max: 41,
            term: "Grave"
        },
        {
            min: 40,
            max: 60,
            term: "Largo"
        },
        {
            min: 59,
            max: 66,
            term: "Larghetto"
        }
    ]

    return function(value) { 
          var result = [];
          angular.forEach(terms, function(term) {
            if (value > term.min && value < term.max) {
                result.push( value); 
            }
          });
        return result[0]
    }
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app" ng-controller="ctrl">
 <div ng-repeat="item in values">{{item | latinTerm}}</div>
</div>
&#13;
&#13;
&#13;