Angular 过滤器中的 forEach 未返回
forEach in Angular filter not returning
我有一个过滤器可以将 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;
}
});
}
});
但这 return 没有任何意义,即使该值介于所提供的值之间。
从这个意义上说,我是不是用错了过滤器?或者它可以调整工作吗?
谢谢。
当你需要打破循环时你不能使用 forEach
和 return 因为它不会中断。您可以使用 老式 for
循环来实现它。
引用 Array.prototype.forEach
| MDN,
There is no way to stop or break a forEach() loop other than by throwing an exception. If you need such behavior, the forEach() method is the wrong tool, use a plain loop instead.
像这样:
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;
}
}
}
});
您不能 return 在 foreach 内部,因为它不会在 each 内部中断。您可以做的一件事是根据条件为变量赋值或使用 for 循环
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]
}
});
<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>
如果你仍然需要使用angular.forEach(它发生了),只需使用一个变量:
return function(value) {
var returnValue;
angular.forEach(terms, function(term) {
if (value > term.min && value < term.max) {
returnValue = value;
}
});
return returnValue;
}
我有一个过滤器可以将 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;
}
});
}
});
但这 return 没有任何意义,即使该值介于所提供的值之间。
从这个意义上说,我是不是用错了过滤器?或者它可以调整工作吗?
谢谢。
当你需要打破循环时你不能使用 forEach
和 return 因为它不会中断。您可以使用 老式 for
循环来实现它。
引用 Array.prototype.forEach
| MDN,
There is no way to stop or break a forEach() loop other than by throwing an exception. If you need such behavior, the forEach() method is the wrong tool, use a plain loop instead.
像这样:
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;
}
}
}
});
您不能 return 在 foreach 内部,因为它不会在 each 内部中断。您可以做的一件事是根据条件为变量赋值或使用 for 循环
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]
}
});
<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>
如果你仍然需要使用angular.forEach(它发生了),只需使用一个变量:
return function(value) {
var returnValue;
angular.forEach(terms, function(term) {
if (value > term.min && value < term.max) {
returnValue = value;
}
});
return returnValue;
}