Geben Sie den Indexwert von der Filtermethode Javascript zurück

Lesezeit: 6 Minuten

Benutzeravatar von alsco77
auch77

Ich habe ein Array von Objekten in meinem Winkelcontroller.

Ich möchte den Wert des Indexes des Feldes innerhalb des Arrays zurückgeben, das eine übereinstimmende ID zu meinem Parameter hat.

Es wird nur ein Objekt im Array mit einer Übereinstimmung geben fieldId..

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

  • 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


Benutzeravatar von quime parle
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.

Sehen Sie sich die Dokumentation hier an.

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

Benutzeravatar von Ruben Nagoga
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

    – AR Naseef

    8. August um 12:07 Uhr

Benutzeravatar von Jivings
Jivings

Von dem Array.prototype.filter Dokumentation:

Callback wird mit drei Argumenten aufgerufen:

  • der Wert des Elements
  • der Index des Elements
  • das Array-Objekt, das durchlaufen wird

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

Benutzeravatar von Dean Jones
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]

RETURN MULTIPLE INDEXES (ersetzt findIndex METHOD)

[1, 1, 2, 2, 2, 3, 4, 5].map((e,i) => e === 2 ? i : undefined).filter(x => x) //returns [2, 3, 4]

RETURN MULTIPLE VALUES (ersetzt find METHOD)

[5, 12, 8, 130, 44].map((e,i) => e > 13 ? e : undefined).filter(x => x) // returns [130, 44]

Benutzeravatar von TJ Crowder
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

Benutzeravatar von JustAnotherDeveloper
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.

var data = {
    indexes: []
};
var myArray = [1,2,3,4,5,6,7,8,9,10];

myArray.filter(function (element, index) {
    if (element%2 == 0) {
        this.indexes.push(index);
        return true;
    }
}, data);

console.log(data.indexes); // [1, 3, 5, 7, 9]
data.indexes.forEach(function(value) {
    console.log(myArray[value]);
}); // 2, 4, 6, 8, 10

  • 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.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex

  • Dies sollte die relevante Antwort sein!

    – Vaiman Hunor

    28. Oktober 2020 um 14:12 Uhr

1404110cookie-checkGeben Sie den Indexwert von der Filtermethode Javascript zurück

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy