2017-04-05 53 views
1

我有一個過濾器,轉換一個BPM整數正確的拉丁語。的forEach在角過濾不返回

起初我對每個拉丁語的,如果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

當你需要打破循環並返回一些東西,因爲它沒有中斷時,你不能使用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

非常感謝!現在有道理。我嘗試編輯你的示例,因爲for循環上有一個額外的括號,但編輯需要6個字符或更多... :) – Lovelock

+0

@Lovelock很高興我可以幫助..(修復額外支架,謝謝)btw,添加更多解釋。請upvote並接受,如果它幫助:) – tanmay

+1

我會接受一旦計時器已經:) – Lovelock

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] 
 
    } 
 
});
<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>

2

如果您仍然需要使用angular.forEach(它發生),只需使用一個變量值分配給變量:

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