10

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

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

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


到目前为止,我还没有找到 Angular 解决方案,因为我无法在此页面上获得太多有用的信息。所以我使用了Array'sindexOf方法:

 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/

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

4

3 回答 3

5

试试这个选项:

 $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

于 2013-09-27T14:03:54.687 回答
4

我发现这更简单,更具可读性

index = ar.findIndex(e => e.id == 2);
于 2016-12-20T16:18:59.890 回答
2

不确定为什么需要原始索引,但可以将原始索引作为新属性添加到对象本身。例如:编写一个过滤器来添加 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 上工作,它似乎在依赖注入时遇到了问题。

于 2013-09-27T13:53:40.290 回答