Получить индекс элемента после использования фильтра

у меня есть массив с объектами. Я хочу найти индекс конкретного объекта. Этот объект имеет уникальный id значение свойства, и я могу найти его с $filter :

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

но как я могу знать, что индекс этого элемента в исходном массиве? Делает $filter можете предоставить мне эту информацию?


к настоящему времени я не нашел углового решения, потому что я не могу получить много полезной информации о на этой странице. Поэтому я использовал Array ' s indexOf метод :

 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/

но это слишком долго и я уверен, что я изобретать колесо здесь...

3 ответов


попробовать такой вариант:

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

Я думаю, что это немного коротко и ясно.

посмотреть Скрипка


не уверен, зачем вам нужен исходный индекс, но вы можете добавить исходный индекс как новое свойство к самому объекту. Например: напишите фильтр, чтобы добавить 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, похоже, у него проблемы с инъекцией зависимостей..


Я нахожу это более простым и читаемым

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