Dies ist keine Angujarjs-Frage, sondern eine allgemeine Javascript-Frage, also würde ich die entfernen angularjs Schild. Aber es ist trotzdem eine interessante Frage, weil andere Sprachen Methoden haben, damit umzugehen. Siehe meine Antwort unten, wo ich a implementiere mitIndex Methode ein Array.
– Ferran Maylinch
3. Mai 2018 um 20:46 Uhr
quime parle
Das .findIndex() -Methode gibt den Index des ersten Elements des Arrays zurück, das eine von einer Funktion angegebene Bedingung erfüllt. Wenn die Funktion zurückkehrt false für alle Elemente des Arrays ist das Ergebnis -1.
In meinem Beispiel x ist ein Element für jede Iteration und ich verwende die Kreuzfunktion für meine Bedingung.
const datas = [];
const fieldId = 5;
let index = datas.findIndex( x => x.Id === fieldId );
Bitte fügen Sie eine Beschreibung hinzu, was im Code gemacht wird.
– Gourav
20. März 2019 um 11:28 Uhr
Willkommen bei Stapelüberlauf! Während dieser Code die Frage lösen kann, inklusive Erklärung wie und warum dies das Problem löst, würde wirklich dazu beitragen, die Qualität Ihres Beitrags zu verbessern, und wahrscheinlich zu mehr Up-Votes führen. Denken Sie daran, dass Sie die Frage für zukünftige Leser beantworten, nicht nur für die Person, die jetzt fragt. Bitte bearbeiten Sie Ihre Antwort, um Erklärungen hinzuzufügen und einen Hinweis darauf zu geben, welche Einschränkungen und Annahmen gelten.
– Doppel-Piep
20. März 2019 um 12:28 Uhr
Ich denke, die letzte Zeile sollte lauten: let index = datas.findIndex( x => x === fieldId );
– Yuri Christich
14. Oktober 2020 um 18:20 Uhr
Hat prima geklappt, danke! Es war das, was ich brauchte
– Jhonnatan Eduardo
2. Juni 2021 um 14:56 Uhr
Ruben Nagoga
Sie können den Index nicht von der Filtermethode zurückgeben.
Die Methode filter() erstellt ein neues Array mit allen Elementen, die den von der bereitgestellten Funktion implementierten Test bestehen.
Sie können verwenden forEach
$scope.indexOfField = function(fieldId) {
var i;
return $scope.model.fieldData.forEach(function(x, index) {
if (x.Id === fieldId) {
i = index;
}
});
// use i
}
oder noch besser zu verwenden for da Sie nicht für jeden aufhören können, wenn Sie Ihre ID gefunden haben.
$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
}
Dadurch wird jedes Element durchlaufen, anstatt anzuhalten, nachdem das richtige Element gefunden wurde.
– Jivings
20. Oktober 2014 um 15:00 Uhr
Danke. Ich habe ein paar Änderungen an der for-Schleife vorgenommen und sie tut, was ich will
– auch77
20. Oktober 2014 um 15:07 Uhr
“i” ist möglicherweise nicht der gewünschte Index, falls das gesamte Array durchlaufen wird und das gesuchte Objekt nicht gefunden wird
– Elachell
1. Juni 2017 um 11:10 Uhr
Hier ist eine einfache Lösung – stackoverflow.com/a/60223559/6775942
Sie sollten jedoch wahrscheinlich die verwenden some Funktion, wenn es nur eine Instanz in Ihrem Array gibt (da es aufhört, sobald es das erste Vorkommen findet), und finden Sie dann den Index mit indexOf:
var field = $scope.model.fieldData.filter(function(x) {
return x.Id === fieldId;
})[0];
var index = $scope.model.fieldData.indexOf(field);
Oder iterieren Sie das Array, bis Sie das richtige Element gefunden haben:
var index;
$scope.model.fieldData.some(function(x, i) {
if (x.Id === fieldId) return (index = i);
});
Dekan Jones
ARRAY (MEHRERE INDIZES FINDEN) METHODE
[10, 7, 13, 15, 230].map((e,i) => e > 13 ? i : undefined).filter(x => x)
//returns [3, 4](*** RETURNS multiple indexes ***)
//FILTER (is simply just REMOVING the UNDEFINED elements (which are FALSY and considered the same as FALSE)
sonst bekommst du…
[10, 7, 13, 15, 230].map((e,i) => e > 13 ? i : undefined) //returns [undefined, undefined, undefined, 3, 4]
[5, 12, 8, 130, 44].map((e,i) => e > 13 ? e : undefined).filter(x => x) // returns [130, 44]
TJ Crowder
Das zweite Argument für Ihren Rückruf ist der Index. Ich kann nicht ganz erkennen, was Ihre Funktion tun/zurückgeben soll, aber wenn Sie hinzufügen , index nach function(xwodurch Sie Zugriff auf den Index für diese Iteration erhalten.
Arbeiten von der Name Ihrer Funktion, ich glaube nicht, dass Sie wollen filter überhaupt:
$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 stoppt bei der ersten Iteration, die einen wahren Wert zurückgibt, also hören wir auf zu suchen, wenn wir zum ersten Mal eine Übereinstimmung finden.
Das Ergebnis ist in diesem Beispiel nicht erreichbar
– auch77
20. Oktober 2014 um 14:57 Uhr
@AlexScott: Was meinst du mit “nicht erreichbar”? Der Rückruf ist ein Abschluss, und der Abschluss hat Zugriff auf die result Variable.
– TJ Crowder
20. Oktober 2014 um 15:00 Uhr
@Jivings: Nein, deshalb verwende ich some im Beispiel – also hören wir auf, sobald wir eine Übereinstimmung finden.
– TJ Crowder
20. Oktober 2014 um 15:08 Uhr
@Jivings: Folge dir nicht. Das some bit war ungefähr 10 Minuten vor deinem Kommentar da. Aber wenn der Kommentar nicht mehr relevant ist, keine Sorge, löschen Sie ihn einfach.
– TJ Crowder
20. Oktober 2014 um 15:19 Uhr
JustAnotherDeveloper
Sie können den Index nicht direkt zurückgeben, aber Sie können den festlegen ‘thisArg’-Parameter und Daten darin setzen. Dies ist sauberer als eine globale Variable.
Das Ergebnis ist in diesem Beispiel nicht erreichbar
– auch77
20. Oktober 2014 um 14:57 Uhr
@AlexScott: Was meinst du mit “nicht erreichbar”? Der Rückruf ist ein Abschluss, und der Abschluss hat Zugriff auf die result Variable.
– TJ Crowder
20. Oktober 2014 um 15:00 Uhr
@Jivings: Nein, deshalb benutze ich some im Beispiel – also hören wir auf, sobald wir eine Übereinstimmung finden.
– TJ Crowder
20. Oktober 2014 um 15:08 Uhr
@Jivings: Folge dir nicht. Das some bit war ungefähr 10 Minuten vor deinem Kommentar da. Aber wenn der Kommentar nicht mehr relevant ist, keine Sorge, löschen Sie ihn einfach.
– TJ Crowder
20. Oktober 2014 um 15:19 Uhr
Verwenden Sie die findIndex Methode – Array.prototype.findIndex().
Wenn die Bedingung zuerst erfüllt ist, wird der Index zurückgegeben.
Dies ist keine Angujarjs-Frage, sondern eine allgemeine Javascript-Frage, also würde ich die entfernen
angularjs
Schild. Aber es ist trotzdem eine interessante Frage, weil andere Sprachen Methoden haben, damit umzugehen. Siehe meine Antwort unten, wo ich a implementiere mitIndex Methode einArray
.– Ferran Maylinch
3. Mai 2018 um 20:46 Uhr