web-dev-qa-db-fra.com

Équivalent de angular.equals en angular2

Je travaille sur la migration de angular 1 project to angular 2. In angular 1 project) J'utilisais angular.equals pour la comparaison d'objets angular.equals($ctrl.obj1, $ctrl.newObj);, j'ai recherché en ligne une méthode équivalente dans angular 2 mais je n'ai trouvé aucun résultat correspondant.

21
Dmehro

@ Günter Oui, vous avez raison, il n'y a pas d'équivalent dans angular2. En cherchant plus, j'ai trouvé une bibliothèque tierce loadash qui fera le même travail que angular.equals et syntex est identique à angular et cette bibliothèque résout mon problème

Extrait de code de la documentation de loadash

var object = { 'a': 1 };
var other = { 'a': 1 };

_.isEqual(object, other);
// => true

object === other;
// => false
14
Dmehro

J'ai réécrit la réponse d'Ariels (merci!) Pour être compatible avec TSLINT. Vous pouvez également enregistrer certains continue en utilisant else if, mais je pense que c'est plus clair. Peut-être que quelqu'un d'autre en a besoin aussi:

export function deepEquals(x, y) {
  if (x === y) {
    return true; // if both x and y are null or undefined and exactly the same
  } else if (!(x instanceof Object) || !(y instanceof Object)) {
    return false; // if they are not strictly equal, they both need to be Objects
  } else if (x.constructor !== y.constructor) {
    // they must have the exact same prototype chain, the closest we can do is
    // test their constructor.
    return false;
  } else {
    for (const p in x) {
      if (!x.hasOwnProperty(p)) {
        continue; // other properties were tested using x.constructor === y.constructor
      }
      if (!y.hasOwnProperty(p)) {
        return false; // allows to compare x[ p ] and y[ p ] when set to undefined
      }
      if (x[p] === y[p]) {
        continue; // if they have the same strict value or identity then they are equal
      }
      if (typeof (x[p]) !== 'object') {
        return false; // Numbers, Strings, Functions, Booleans must be strictly equal
      }
      if (!deepEquals(x[p], y[p])) {
        return false;
      }
    }
    for (const p in y) {
      if (y.hasOwnProperty(p) && !x.hasOwnProperty(p)) {
        return false;
      }
    }
    return true;
  }
}
12
Phil

Au lieu d'écrire une fonction pour parcourir les objets, vous pouvez simplement utiliser JSON.stringify et comparer les deux chaînes?

Exemple:

var obj1 = {
  title: 'title1',
  tags: []
}

var obj2 = {
  title: 'title1',
  tags: ['r']
}


console.log(JSON.stringify(obj1));
console.log(JSON.stringify(obj2));


console.log(JSON.stringify(obj1) === JSON.stringify(obj2));
6
Stephen Kaiser

Dans Angular 2 vous devez utiliser du JavaScript/TypeScript pur pour cela afin que vous puissiez ajouter cette méthode à un service

private static equals(x, y) {
    if (x === y)
        return true;
    // if both x and y are null or undefined and exactly the same
    if (!(x instanceof Object) || !(y instanceof Object))
        return false;
    // if they are not strictly equal, they both need to be Objects
    if (x.constructor !== y.constructor)
        return false;
    // they must have the exact same prototype chain, the closest we can do is
    // test there constructor.

    let p;
    for (p in x) {
        if (!x.hasOwnProperty(p))
            continue;
        // other properties were tested using x.constructor === y.constructor
        if (!y.hasOwnProperty(p))
            return false;
        // allows to compare x[ p ] and y[ p ] when set to undefined
        if (x[p] === y[p])
            continue;
        // if they have the same strict value or identity then they are equal
        if (typeof (x[p]) !== "object")
            return false;
        // Numbers, Strings, Functions, Booleans must be strictly equal
        if (!RXBox.equals(x[p], y[p]))
            return false;
    }
    for (p in y) {
        if (y.hasOwnProperty(p) && !x.hasOwnProperty(p))
            return false;
    }
    return true;
}
4
Ariel Henryson
a = { name: 'me' }
b = { name: 'me' }
a == b // false
a === b // false
JSON.stringify(a) == JSON.stringify(b) // true
JSON.stringify(a) === JSON.stringify(b) // true
1
Mr.Zon