2014-10-20 14 views
5

Mam zatem szereg obiektów w moim sterowniku kątowym i Chcę zwrócić wartość indeksu pola w tablicy, która ma pasujący identyfikator do mojego parametru. W tablicy będzie tylko jeden obiekt z pasującym polem ID ..Wartość indeksu powrotnego z metody filtru javascript

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

Odpowiedz

5

nie można powrócić indeks z metodą filtracyjną.

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

Można użyć forEach

Sposób filtr() tworzy nową tablicę ze wszystkimi elementami, które przechodzą test realizowane przez funkcję pod warunkiem.

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

lub nawet lepiej używać for jak nie można przestać foreach, kiedy odkryli swój identyfikator.

$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

Spowoduje to powtórzenie każdego elementu zamiast zatrzymania po znalezieniu właściwego elementu. – Jivings

+0

dzięki. wprowadziłem kilka zmian w pętli for i robi to, co chcę – alsco77

+0

"i" może nie być pożądanym indeksem w przypadku, gdy cała tablica jest przesuwana i poszukiwany obiekt nie został znaleziony – elachell

4

Drugim argumentem wywołania zwrotnego jest indeks. Nie wiem, co chcesz zrobić/powrócić, ale jeśli dodasz , index po function(x, da ci to dostęp do indeksu dla tej iteracji.

Praca od nazwy swojej funkcji, nie sądzę chcesz filter w ogóle:

$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 przystanki jako pierwszej iteracji, która zwraca wartość truthy, więc zatrzymujemy przeszukując pierwszy raz, kiedy znajdziemy dopasowanie.

+0

wynik jest nieosiągalny w tym przykładzie – alsco77

+0

@AlexScott: Co masz na myśli przez "nieosiągalny"? Oddzwanianie jest zamknięciem, a zamknięcie ma dostęp do zmiennej 'result'. –

+0

@Jivings: Nie, dlatego używam "niektórych" w przykładzie - więc zatrzymujemy się, gdy tylko znajdziemy dopasowanie. –

4

Z dokumentacji Array.prototype.filter:

zwrotna jest wywoływana z trzema argumentami:

  • wartość elementu
  • indeks elementu
  • obiekt Array przejeżdżającego

Należy jednak prawdopodobnie za pomocą funkcji some jeśli istnieje tylko jedna instancja w tablicy (jak to się skończy, jak tylko znajdzie pierwsze wystąpienie), a następnie znaleźć indeks używając indexOf:

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

Albo iterację tablicę aż znajdziesz właściwą element:

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

Filtr nie zwróci indeksu, ale możesz zrobić coś takiego.

$scope.indexOfField = function(fieldId) { 
    $scope.model.fieldData.filter(function(x, i) { 
     if (x.Id === fieldId) { 
      var indexOfField = i; 
     } 
    }); 
    return indexOfField; 
}; 
Powiązane problemy