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