zoukankan      html  css  js  c++  java
  • vue 源码 学习days8-比较两个对象的方法

    // 在面试中可能会遇到, 思想重要
    // 比较两个对象是否是相等的 两个对象
    // 1. js 中对象是无法使用 == 来比较的, 比是地址
    // 2. 我们一般会定义如果对象的各个属性值都相等 那么对象就是相等的对象. 例如: {} 就与 {} 相等.
    // 算法描述
    // 1. 假定对象 a 和 b
    // 2. 遍历 a 中的成员, 判断是否每一个 a 中的成员都在 b 中. 并且 与 b 中的对应成员相等.
    // 3. 再遍历 b 中的成员, 判断是否每一个 b 中的成员都在 a 中. 并且 与 a 中的对应成员相等.
    // 4. 如果成员是引用类型, 递归.

    // 抽象一下, 判断两个集合是否相等

    /**
     * Check if two values are loosely equal - that is,
     * if they are plain objects, do they have the same shape?
     */
    function looseEqual (a: any, b: any): boolean {
      if (a === b) return true
      const isObjectA = isObject(a)
      const isObjectB = isObject(b)
      if (isObjectA && isObjectB) {
        try {
          const isArrayA = Array.isArray(a)
          const isArrayB = Array.isArray(b)
          if (isArrayA && isArrayB) {
            return a.length === b.length && a.every((e, i) => {
              return looseEqual(e, b[i]) // b 包含 a
            })
          } else if (a instanceof Date && b instanceof Date) {
            return a.getTime() === b.getTime() // 单独处理 Date 类型, 时间戳应该是一样的
          } else if ( 0 ) {
            // 如果需要考虑其它类型, 添加 if 即可
          } else if (!isArrayA && !isArrayB) {
            const keysA = Object.keys(a)
            const keysB = Object.keys(b)
            // 先判断 key 的长度, 再判断 a 包含于 b
            return keysA.length === keysB.length && keysA.every(key => {
              return looseEqual(a[key], b[key])
            })
          } else {
            /* istanbul ignore next */
            return false
          }
        } catch (e) {
          /* istanbul ignore next */
          return false
        }
      } else if (!isObjectA && !isObjectB) {
        return String(a) === String(b)
      } else {
        return false
      }
    }
  • 相关阅读:
    北大ACM 1008题—Maya Calendar
    C++ 输出彩色的控制台
    北大ACM 1003题—Hangover
    北大ACM 1009题—Edge Detection
    北大ACM 1004题—Financial Management
    北大ACM 1005题—I Think I Need a Houseboat
    Linux和win7双系统时间错误问题
    转化率极高的十个网站 怎样来提高转化率
    5次Shift粘滞键后门的应用
    单元测试基础知识
  • 原文地址:https://www.cnblogs.com/xsx123-/p/12155090.html
Copyright © 2011-2022 走看看