序言

在鸿蒙开发中由于其使用@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)) {}
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐