vue 源码 学习days8-比较两个对象的方法
2024-10-08 04:43:40
// 在面试中可能会遇到, 思想重要
// 比较两个对象是否是相等的 两个对象
// 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
}
}
最新文章
- CPlus的简单线程的制作
- [问题2014A12] 解答
- python built-in delattr()
- CSS兼容性
- writeToFile 读写文件问题
- cxf客户端代码wsdlLocation设置相对路径
- iOS开发之自定义输入框(利用UITextField及UITextView)
- Selenium WebDriver 学习笔记
- ES6对象扩展
- spring boot之入门Controller常用注解
- 学习 JavaScript(二)在 HTML 中使用 JS
- MyBatis学习笔记3--使用XML配置SQL映射器
- hihoCoder week6 01背包
- mezzanine的page表
- Windows Server2012 R2 安装.NET Framework 3.5失败解决方法
- Scrum 项目 3.0
- 基于HTML5/CSS3图片网格动画特效
- Python学习---django模板语法180122
- 解决因生成javadoc失败导致Maven打包失败问题
- Frequent values UVA - 11235(巧妙地RMQ)
热门文章
- ODT模板
- python不得不知的几个开源项目
- [转]Android Studio实现代码混淆
- Python--day64--找到作者关联的所有书籍对象、ORM多对多关联查询的原理
- H3C PPP协议的组成
- sdk uncaught third Error Cannot assign to read only property &#39;constructor&#39; of object &#39;#<;V>;&#39; (小程序)
- Vue 组件切换
- javaScript 删除事件 弹出确认 取消对话框
- Aizu 0531 ";Paint Color"; (坐标离散化+DFS or BFS)
- Spring Data -Specification用法和常用查询方法(in,join,equal等)