2013-09-27 2 views
9

Ho una matrice con oggetti. Voglio trovare l'indice di un oggetto specifico. Questo oggetto ha un valore unico id proprieta', e posso trovare con un $filter:Ottieni l'indice degli elementi dopo aver utilizzato il filtro

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

ma come faccio a sapere che cosa è l'indice di questo elemento nella sua matrice originale? $filter può fornirmi queste informazioni?


Ormai non ho trovato una soluzione angolare, perché non riesco a ottenere informazioni molto utili su this page. Così ho usato s' ArrayindexOf metodo:

var el_index = tabs.indexOf(el); 

http://jsfiddle.net/BhxVV/

Per ottenere gli indici di tutti gli elementi con specifica id andiamo modo simile:

$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/

Ma è troppo lungo e sono sicuro che sto reinventando la ruota qui ...

risposta

5

Prova questa opzione:

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

Penso che sia un po 'breve e chiaro.

Vedi Fiddle

+0

bene! ho dimenticato di passare una funzione come argomento per un filtro – Cherniv

2

Non sono sicuro del motivo per cui è necessario l'indice originale, ma è possibile aggiungere l'indice originale come nuova proprietà all'oggetto stesso. Ad esempio: scrivere un filtro per aggiungere l'IDX:

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

allora si può ottenere questa espressione in html:

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

O in javascript:

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

In qualche modo non riesco a funziona su jsfiddle, sembra avere problemi con l'iniezione delle dipendenze ..

2

Trovo che questo sia più semplice e più leggibile

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