@ngx-translate/core
Version:
77 lines (73 loc) • 2.31 kB
text/typescript
/* tslint:disable */
/**
* Determines if two objects or two values are equivalent.
*
* Two objects or values are considered equivalent if at least one of the following is true:
*
* * Both objects or values pass `===` comparison.
* * Both objects or values are of the same type and all of their properties are equal by
* comparing them with `equals`.
*
* @param o1 Object or value to compare.
* @param o2 Object or value to compare.
* @returns true if arguments are equal.
*/
export function equals(o1: any, o2: any): boolean {
if (o1 === o2) return true;
if (o1 === null || o2 === null) return false;
if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN
let t1 = typeof o1, t2 = typeof o2, length: number, key: any, keySet: any;
if (t1 == t2 && t1 == 'object') {
if (Array.isArray(o1)) {
if (!Array.isArray(o2)) return false;
if ((length = o1.length) == o2.length) {
for (key = 0; key < length; key++) {
if (!equals(o1[key], o2[key])) return false;
}
return true;
}
} else {
if (Array.isArray(o2)) {
return false;
}
keySet = Object.create(null);
for (key in o1) {
if (!equals(o1[key], o2[key])) {
return false;
}
keySet[key] = true;
}
for (key in o2) {
if (!(key in keySet) && typeof o2[key] !== 'undefined') {
return false;
}
}
return true;
}
}
return false;
}
/* tslint:enable */
export function isDefined(value: any): boolean {
return typeof value !== 'undefined' && value !== null;
}
export function isObject(item: any): boolean {
return (item && typeof item === 'object' && !Array.isArray(item));
}
export function mergeDeep(target: any, source: any): any {
let output = Object.assign({}, target);
if (isObject(target) && isObject(source)) {
Object.keys(source).forEach((key: any) => {
if (isObject(source[key])) {
if (!(key in target)) {
Object.assign(output, {[key]: source[key]});
} else {
output[key] = mergeDeep(target[key], source[key]);
}
} else {
Object.assign(output, {[key]: source[key]});
}
});
}
return output;
}