web-dev-qa-db-de.com

Wie erhalte ich den Index eines Objekts in einer AngularJS-Antwortobjektsammlung?

Anwendungsfall

Ich habe eine Sammlung von Objekten, die von einer REST -Anforderung zurückgegeben wurden. Angular füllt jedes Element automatisch mit einem $$hashKey. Das Problem ist, dass bei der Suche nach einem Objekt in diesem Array ohne den $$hashKey -1 zurückgegeben wird. Das macht Sinn. Leider kenne ich den Wert von $$hashKey nicht.

Frage

Gibt es eine effektivere Möglichkeit, nach einem Objekt in einer Objektsammlung zu suchen, die von einer REST -Anforderung in AngularJS zurückgegeben wurde, ohne die Eigenschaft $$hashKey zu entfernen?

Code

function arrayObjectIndexOf(arr, obj) {
var regex = /,?"\$\$hashKey":".*?",?/;
    var search = JSON.stringify(obj).replace(regex, '');
    console.log(search);
    for ( var i = 0, k = arr.length; i < k; i++ ){
        if (JSON.stringify(arr[i]).replace(regex, '') == search) {
            return i;
        }
    };
    return -1;
};
10
Pete

angular.equals() führt einen tiefen Vergleich von Objekten ohne die $-vorangestellten Eigenschaften durch ...

function arrayObjectIndexOf(arr, obj){
    for(var i = 0; i < arr.length; i++){
        if(angular.equals(arr[i], obj)){
            return i;
        }
    };
    return -1;
}
21
Anthony Chu

Da es eckig ist, warum nicht filtern:

$ filter ('filter') (Seiten, {id: pageId}, true);

dabei ist Seiten das Array und ID ist die Objekteigenschaft, die Sie abgleichen möchten, und PageId ist der Wert, mit dem Sie abgleichen.

5
MrWiLofDoom

Ok, das ist ein bisschen hässlich, aber es ist die einfachste Lösung:

function arrayObjectIndexOf(arr, obj) {
    JSON.parse(angular.toJson(arr)).indexOf(obj)
}

Das angular.toJson-Bit entfernt alle Attribute mit einem führenden $. Vielleicht möchten Sie das saubere Objekt irgendwo für die Suche speichern. Alternativ könnten Sie auch Ihre eigenen Vergleichsprodukte schreiben, aber das ist halt blöd.

1
Tim Brown

Verwenden Sie die Suchfunktion von lodash, um Filter zu bearbeiten, überprüfen Sie docs http://lodash.com/docs

0
Issam Zoli