1

我有两个过滤器,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上面几乎相同的过滤器过滤器,它就会起作用。任何想法为什么?

这是一个更新的 Plunkr。

4

1 回答 1

0

您必须在此处使用类似数组的表示法(您也可以将其用于对象)。item.ref表示被调用的属性ref,而item[ref]将表示被调用的属性,无论表达式中的表达式[]计算为什么(在这种情况下,存储在变量中的任何内容被调用ref)。

if( list[i][ref] == item[ref] ) {

换句话说,写作item.ref等同于写作item['ref']

于 2013-11-05T22:39:56.520 回答