【问题标题】:Get element's index after using filter使用过滤器后获取元素的索引
【发布时间】:2013-10-03 18:00:18
【问题描述】:

我有一个包含对象的数组。我想找到一个特定对象的索引。这个对象有一个独特的id 属性值,我可以用$filter 找到它:

 var el = $filter('filter')( tabs, { id: id })[0]; // "el" is my unique element 

但是我怎么知道这个元素在它的原始数组中的索引是什么? $filter 可以提供这些信息吗?


到目前为止,我还没有找到 Angular 解决方案,因为我无法在 this page 上获得太多有用的信息。所以我使用了ArrayindexOf方法:

 var el_index = tabs.indexOf( el );

http://jsfiddle.net/BhxVV/

要获取具有特定id 的所有元素的索引,我们采用类似的方式:

 $scope.getTabsIndexes = function(id){
      var els = $filter('filter')( tabs , { id: id });
      var indexes = [];
      if(els.length) { 
          var last_i=0;
          while( els.length ){
             indexes.push( last_i = tabs.indexOf( els.shift() , last_i ) );
          }
      }
      return indexes;        
 }

http://jsfiddle.net/BnBCS/1/

但它太长了,我确定我在这里重新发明轮子......

【问题讨论】:

    标签: javascript angularjs angularjs-filter


    【解决方案1】:

    不确定为什么需要原始索引,但您可以将原始索引作为新属性添加到对象本身。例如:编写一个过滤器来添加 idx:

    angular.module('yourModule', [])
    .filter('addId', [function() {
        return function(arrObj) {
            for (var i = 0; i < arrObj.length; ++i) {
                arrObj[i].$$originalIdx = i;
            }
            return arrObj;
        };
    }]);
    

    那么就可以在html中得到这个表达式:

    {{ tabs | addIdx | filter:{id: 777} }}
    

    或者在javascript中:

    $scope.getTabIndex = function(id){
        var el = $filter('filter')( addId(tabs) , { id: id })[0];
        var el_index = el.$$originalIdx;
        return el_index;        
    };
    

    不知怎的,我无法让它在 jsfiddle 上运行,它似乎在依赖注入方面遇到了问题。..

    【讨论】:

      【解决方案2】:

      试试这个选项:

       $scope.search = function(selectedItem) {         
      
          $filter('filter')($scope.tabs, function(item) {
      
              if(selectedItem == item.id){             
                   $scope.indexes.push( $scope.tabs.indexOf(item)  );               
                  return true;
              }
      
              return false;
          });       
       } 
      

      我认为它有点简短和清晰。

      Fiddle

      【讨论】:

      • 好!我忘了将函数作为参数传递给过滤器
      【解决方案3】:

      我觉得这更简单,更易读

      index = ar.findIndex(e => e.id == 2);
      

      【讨论】:

        猜你喜欢
        • 2013-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-21
        • 1970-01-01
        • 2013-12-03
        • 2018-06-03
        • 2021-12-07
        相关资源
        最近更新 更多