// 在面试中可能会遇到, 思想重要
// 比较两个对象是否是相等的 两个对象
// 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
  }
}

最新文章

  1. CPlus的简单线程的制作
  2. [问题2014A12] 解答
  3. python built-in delattr()
  4. CSS兼容性
  5. writeToFile 读写文件问题
  6. cxf客户端代码wsdlLocation设置相对路径
  7. iOS开发之自定义输入框(利用UITextField及UITextView)
  8. Selenium WebDriver 学习笔记
  9. ES6对象扩展
  10. spring boot之入门Controller常用注解
  11. 学习 JavaScript(二)在 HTML 中使用 JS
  12. MyBatis学习笔记3--使用XML配置SQL映射器
  13. hihoCoder week6 01背包
  14. mezzanine的page表
  15. Windows Server2012 R2 安装.NET Framework 3.5失败解决方法
  16. Scrum 项目 3.0
  17. 基于HTML5/CSS3图片网格动画特效
  18. Python学习---django模板语法180122
  19. 解决因生成javadoc失败导致Maven打包失败问题
  20. Frequent values UVA - 11235(巧妙地RMQ)

热门文章

  1. ODT模板
  2. python不得不知的几个开源项目
  3. [转]Android Studio实现代码混淆
  4. Python--day64--找到作者关联的所有书籍对象、ORM多对多关联查询的原理
  5. H3C PPP协议的组成
  6. sdk uncaught third Error Cannot assign to read only property 'constructor' of object '#<V>' (小程序)
  7. Vue 组件切换
  8. javaScript 删除事件 弹出确认 取消对话框
  9. Aizu 0531 "Paint Color" (坐标离散化+DFS or BFS)
  10. Spring Data -Specification用法和常用查询方法(in,join,equal等)