我有一个过滤器,可以将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;
}
});
}
});
但即使值在提供的值之间,这也不会返回任何内容。
在这种意义上,我使用的过滤器是错误的吗?或者它可以调整工作吗?
感谢。
答案 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内部返回,因为它不会为每个内部而破坏。您可以做的一件事是根据条件或用于循环
为变量赋值
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;