angularjs - Ekvivalenten av angular.equals i angular2
Jeg jobber med migrering av et Angular 1-prosjekt til Angular 2. I Angular 1-prosjektet brukte jeg angular.equals for objektsammenligning angular.equals($ctrl.obj1, $ctrl.newObj);, jeg søkte på nettet etter tilsvarende metode i Angular 2, men kunne ikke finne noen matchende resultat.
Svar #1
@Günter Ja, du har rett, det er ingen tilsvarende i angular2. Mens jeg søkte mer, fant jeg tredjepartsbiblioteket lodash som gjør den samme jobben som angular.equals, og syntaksen er den samme som i angular, og dette biblioteket løser problemet mitt.
Kodeeksempel fra lodash-dokumentasjonen
var object = { 'a': 1 };
var other = { 'a': 1 };
_.isEqual(object, other);
// => true
object === other;
// => false
Svar #2
Jeg omskrev Ariels svar (takk!) for å være TSLINT-vennlig. Du kan også spare noen continues ved å bruke else if, men jeg synes dette er klarere. Kanskje noen andre trenger det også:
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;
}
}
