鸿蒙中判断两个对象是否相等
序言
在鸿蒙开发中由于其使用@Observed修饰的类会改变原型链,特别是里面的字段。在比较两个类是否相等的时候就会有问题。
举例
比如鸿蒙中的泛型功能比较弱,不能定义方法。有时候就要使用。静态变量,和私有化构造函数来实现自己的枚举。
但是由于存在原型链被修改的情况。通过==符合是不能比较两个对象是否相等的。比如下面两个内容是一样的,但是类都不相同。
这个时候需要编写一个工具栏,通过判断两个对象中的属性是否相同,来判断两个对象是否相同。
function isObject(obj: ESObject): boolean {return obj !== null && typeof obj === 'object';
}/*** 判断 obj1 是否包含 obj2 的所有属性,并且值都一致* @param obj1 基础对象(可以比 obj2 多)* @param obj2 比较对象(必须是 obj1 的子集)* @returns boolean*/
export function isEqual(obj1: ESObject, obj2: ESObject): boolean {if (obj1 === obj2) {return true;}// 如果其中一个是 null 或者不是对象,直接比较是否相等if (!isObject(obj1) || !isObject(obj2)) {return obj1 === obj2;}const keys = Object.keys(obj2);for (const key of keys) {// obj1 中没有 obj2 的某个属性 → 不匹配if (!(key in obj1)) {return false;}const val1 = obj1[key];const val2 = obj2[key];// 如果都是对象,递归检查if (isObject(val1) && isObject(val2)) {if (!isEqual(val1, val2)) {return false;}} else if (typeof val1 === 'function' && typeof val2 === 'function') {// 函数比较其字符串表示if (val1.toString() !== val2.toString()) {return false;}} else {// 其他类型直接比较值if (val1 !== val2) {return false;}}}return true;
}
记住上面的类要保存在一ts结尾的文件,而不是ets结尾的。因为ets为arkTS的文件,会限制一些语法。
使用
if (isEqual(this.item.orderState, OrderState.needUse) || isEqual(this.item.orderState, OrderState.haveUse)) {}