Controllare se un oggetto è in AngularJS matrice in localStorage

Ho questo angularjs matrice: $scope.fav = [] in cui gli elementi (oggetti), sono aggiunte con su una chiamata di funzione. un esempio di questi oggetti sono {quote: "Some text", controller: some_controller} Quando aggiungo un nuovo oggetto array, l’array viene salvato in localstorage. L’array funziona esattamente come voglio, tranne quando si tenta di stampare a console.log() ho molti [object, object], che ho appena assunto è il modo in cui è stampato. Questo non è il problema principale, però, perché l’array funziona come deve.

Il problema che sto avendo è cercando di trovare se un oggetto è già in un array. Ho provato

if ($scope.fav.indexOf({quote: q, controller: c}) == -1)

e questo non sembra funzionare, perché ogni oggetto andando nell’indice -1 anche se era già nell’array. Presumo che questo è perché non è leggendo l’oggetto correttamente.

Infine mi hanno fatto ricorso a questa funzione:

$scope.containsObject = function(obj, list) {
var i;
for (i = 0; i < list.length; i++) {
    if (list[i] === obj) {
        return true;
    }
}

return false;

}

che verifica se l’oggetto è presente nell’array. Ecco come lo chiamo io:

$scope.addToFav = function(q, c) {
    $scope.value = $scope.containsObject({quote: q, controller: c}, $scope.fav)
    console.log($scope.value);

}

Continuo ad avere un valore negativo per $scope.valore anche se l’oggetto è presente nell’array.
Scusate per la lunga complicare la spiegazione.

Grazie per la vostra comprensione,
Ben

 

2 Replies
  1. 7

    Array.indexOf() e il === operatore confrontare i riferimenti agli oggetti e sono reali solo quando si confrontano i riferimenti alla stessa istanza di un oggetto. {quote: q, controller: c} è un oggetto completamente diverso istanza rispetto a quelli della matrice, anche se le sue proprietà corrisponde a un oggetto nell’array esattamente.

    Angolare ha una funzione di supporto chiamato angular.equals() che i controlli di 2 oggetti sono equivalenti. Si può usare al posto del ===

    $scope.containsObject = function(obj, list) {
        var i;
        for (i = 0; i < list.length; i++) {
            if (angular.equals(list[i], obj)) {
                return true;
            }
        }
    
        return false;
    };
    • Grazie mille per Antonio, era una cosa abbastanza semplice soluzione. Applausi, Ben
  2. 2

    Ogni volta che siete il recupero di un oggetto dalla memoria locale, si sta effettivamente creando un nuovo oggetto, probabilmente utilizzando JSON.decodificare, per convertire la stringa di dati memorizzati nella memoria locale, in un oggetto.

    Anche se il nuovo oggetto che contiene i dati, fallirà la prova rigorosa === (e in effetti, sciolto ==) rispetto all’esistente (anche se apparentemente identici) oggetto. indexOf utilizza l’operatore di uguaglianza rigorosa ===, questa si comportano allo stesso modo.

    Quindi hai bisogno di qualche codice per verificare se un oggetto è uguale all’altro, e poi applica un elenco. Un modo è quello di utilizzare una combinazione di angolare.è uguale a, che svolge una profonda confronto di oggetti, e filtro:

    $scope.containsObject = function(obj, list) {
      return list.filter(function(listItem) {
        return angular.equals(listItem, obj)
      }).length > 0;
    }

    Il filter funzione non credo che è parte di IE8. Se avete bisogno di IE8 supportato, è possibile utilizzare il polyfill, o utilizzare un’altra libreria, come lo-dash

    $scope.containsObject = function(obj, list) {
      return _.filter(list, function(listItem) {
        return angular.equals(listItem, obj)
      }).length > 0;
    }

Lascia un commento