我有两个过滤器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&amp; .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。有关如何将所需引用传递给此过滤器的任何建议,以便我可以一般性地使用它来查找任何数组中任何数组项的索引吗?
我不能让这个用于过滤器“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;
}
});
如果像这样调用它,通过匹配'gram'来找到食物单位的索引:
var unitIndex = $filter('getIndex')(food.unit, $scope.editedFood[index].unit.selected, 'gram');
但是,如果我这样称它,它就不起作用,找出数组中是否存在食物单位编辑食物:
var foodIndex = $filter('getIndex')(food, $scope.editedFood, 'uid');
我可以看到我正在传递不同的搜索对象&amp;搜索上下文,但如果我将其传递给上面几乎相同的过滤器findEdited
过滤器,则foodIndex搜索有效。有什么想法吗?
答案 0 :(得分:0)
您必须在此处使用类似数组的表示法(您也可以将其用于对象)。 item.ref
表示名为ref
的属性,而item[ref]
表示调用[]
中的表达式所调用的属性(在这种情况下,存储在变量中的任何内容)叫ref
)。
if( list[i][ref] == item[ref] ) {
换句话说,撰写item.ref
等同于撰写item['ref']
。