我有两个过滤器,findEdited
并且getUnitIndex
. 它们都做同样的事情(在数组中查找元素的索引),但在数组的不同部分。我想将它们组合成一个过滤器,getIndex
.
这是第一个:
myApp.filter('findEdited', function(){
return function(food, foods) {
for (var index in foods) {
if (foods[index].uid == food.uid) {
return index;
}
}
return -1;
}
});
在控制器中:
var index = $filter('findEdited')(food, $scope.editedFood);
第二个:
myApp.filter('getUnitIndex', function () {
return function(list, item) {
for( var i = 0; i < list.length; i++ ) {
if( list[i].gram == item.gram ) {
return(i);
}
}
return(-1);
}
});
控制器:
var unitIndex = $filter('getUnitIndex')(food.unit, $scope.editedFood[index].unit.selected);
据我所知,它们之间唯一的功能区别是 .uid 和 .gram 标识符,它告诉循环要匹配对象的哪个部分。我试图将它们重写为一个过滤器,就像这样,ref
代表这个标识符:
myApp.filter('findIndex', function () {
return function(list, item, ref) {
for( var i = 0; i < list.length; i++ ) {
if( list[i].ref == item.ref ) {
return(i);
}
}
return(-1);
}
});
并像这样调用,如果我想ref
成为 uid:
var unitIndex = $filter('findIndex')(food.unit, $scope.editedFood[index].unit.selected, 'uid');
这行不通。上面的示例在每次运行时返回 0。有关如何将所需的引用传递给此过滤器的任何建议,以便我可以通用地使用它来查找任何数组中任何数组项的索引?
Plunkr
更新
我不能让它对过滤器“findEdited”起作用。我已经像这样编写了我的通用过滤器:
myApp.filter('getIndex', function(){
return function(list, item, ref) {
for (var index in list) {
if (list[index][ref] == item[ref]) {
return index;
}
}
return -1;
}
});
如果这样称呼它,它可以通过匹配“克”来找到食物单位的索引:
var unitIndex = $filter('getIndex')(food.unit, $scope.editedFood[index].unit.selected, 'gram');
但是,如果我这样称呼它,则无法确定数组editedFood中是否存在食物单元:
var foodIndex = $filter('getIndex')(food, $scope.editedFood, 'uid');
我可以看到我正在传递不同的搜索对象和搜索上下文,但是如果我将 foodIndex 搜索传递给findEdited
上面几乎相同的过滤器过滤器,它就会起作用。任何想法为什么?