鸿蒙中判断两个对象是否相等
·
序言
在鸿蒙开发中由于其使用@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)) {}
更多推荐


所有评论(0)