2014-10-20 26 views
5

Quindi ho una matrice di oggetti nel mio controller angolare, e Voglio restituire il valore dell'indice del campo all'interno dell'array che ha un ID corrispondente al mio parametro. Ci sarà un solo oggetto nella matrice con una fieldid corrispondenza ..Valore indice di ritorno dal metodo filtro javascript

$scope.indexOfField = function(fieldId) { 
     return $scope.model.fieldData.filter(function(x) { 
      if (x.Id === fieldId) { 
       return // ??????? 
      } 
     }); 
    } 

risposta

5

non è possibile tornare indice dal metodo del filtro.

The filter() method creates a new array with all elements that pass the test implemented by the provided function.

È possibile utilizzare forEach

Il metodo filter() crea un nuovo array con tutti gli elementi che superano la prova realizzata dalla funzione prevista.

$scope.indexOfField = function(fieldId) { 
     var i; 
     return $scope.model.fieldData.forEach(function(x, index) { 
      if (x.Id === fieldId) { 
       i = index; 
      } 
     }); 
     // use i 
    } 

o addirittura meglio usare for come non si può fermare forEach quando avete trovato il vostro ID.

$scope.indexOfField = function(fieldId) { 
     var fieldData = $scope.model.fieldData, 
      i = 0, ii = $scope.model.fieldData.length; 
     for(i; i < ii; i++) if(fieldData[i].Id === fieldId) break; 
     // use i 
    } 
+1

In tal modo si itererà su ogni elemento invece di fermarsi dopo aver trovato l'elemento corretto. – Jivings

+0

grazie. apportato alcune modifiche al ciclo for e fa ciò che voglio – alsco77

+0

"i" potrebbe non essere l'indice desiderato nel caso in cui l'intero array sia attraversato e l'oggetto ricercato non venga trovato – elachell

4

Il secondo argomento per il callback è l'indice. Non riesco a capire cosa vuoi fare/restituire la tua funzione, ma se aggiungi , index dopo il function(x, questo ti darà accesso all'indice per quell'iterazione.

Lavorando dal nome della funzione, non credo che si desidera filter affatto:

$scope.indexOfField = function(fieldId) { 
    var result = -1; 
    $scope.model.fieldData.some(function(x, index) { 
     if (x.Id === fieldId) { 
      result = index; 
      return true; 
     } 
    }); 
    return result; 
} 

Array#some fermate a partire dalla prima iterazione che restituisce un valore truthy, quindi ci fermeremo cercando la prima volta troviamo una corrispondenza.

+0

risultato non raggiungibile in questo esempio – alsco77

+0

@AlexScott: Cosa intendi per "irraggiungibile"? Il callback è una chiusura e la chiusura ha accesso alla variabile 'result'. –

+0

@Jivings: No, è per questo che sto usando 'some' nell'esempio - quindi ci fermiamo non appena troviamo una corrispondenza. –

4

Dalla documentazione Array.prototype.filter:

callback viene richiamata con tre argomenti:

  • il valore dell'elemento
  • l'indice dell'elemento
  • dell'oggetto Array essendo attraversato

Tuttavia si dovrebbe probabilmente utilizzare la funzione some se v'è una sola istanza in array (in quanto si fermerà non appena trova la prima occorrenza), e poi trovare l'indice utilizzando indexOf:

var field = $scope.model.fieldData.filter(function(x) { 
    return x.Id === fieldId; 
})[0]; 
var index = $scope.model.fieldData.indexOf(field); 

O scorrere l'array fino a trovare l'elemento corretto:

var index; 
$scope.model.fieldData.some(function(x, i) { 
    if (x.Id === fieldId) return (index = i); 
}); 
-1

Il filtro non restituisce l'indice, ma è possibile fare qualcosa di simile.

$scope.indexOfField = function(fieldId) { 
    $scope.model.fieldData.filter(function(x, i) { 
     if (x.Id === fieldId) { 
      var indexOfField = i; 
     } 
    }); 
    return indexOfField; 
}; 
Problemi correlati