如何将这两个索引定位过滤器组合成一个通用过滤器?

时间:2013-11-05 22:37:06

标签: javascript arrays angularjs filter

我有两个过滤器findEditedgetUnitIndex。它们都完全相同(找到数组中元素的索引),但是在数组的不同部分。我想将它们组合成一个过滤器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。有关如何将所需引用传递给此过滤器的任何建议,以便我可以一般性地使用它来查找任何数组中任何数组项的索引吗?

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

如果像这样调用它,通过匹配'gram'来找到食物单位的索引:

var unitIndex = $filter('getIndex')(food.unit, $scope.editedFood[index].unit.selected, 'gram');

但是,如果我这样称它,它就不起作用,找出数组中是否存在食物单位编辑食物:

var foodIndex = $filter('getIndex')(food, $scope.editedFood, 'uid');

我可以看到我正在传递不同的搜索对象&amp;搜索上下文,但如果我将其传递给上面几乎相同的过滤器findEdited过滤器,则foodIndex搜索有效。有什么想法吗?

Here's an updated Plunkr.

1 个答案:

答案 0 :(得分:0)

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

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

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