js面试:手写深度比较 (模拟lodash.isEqual)

什么是深度比较

lodash.isEqual : 比较对象的键值对,都一样则为true,反之false; 若对象的属性值是引用类型,比较的是实际值不是地址(当然,若地址是一样的,那么肯定相等,return true);

图是上课时的截图

思路

默认不会比较函数
1.不是对象,直接返回比较结果,return ===
2. 地址相等的对象 return true
3. 两个都是对象||数组
(1)比较两对象keys的个数
(2)以obj1的key为基准,和obj2依次递归比较

实现


function isEqual (obj1, obj2) {
	//不是对象,直接返回比较结果
	if (typeof obj1 !== 'object' || typeof obj2 !== 'object') {
		return obj1 === obj2
	}
	//都是对象,且地址相同,返回true
	if (obj2 === obj1) return true;
	//是对象或数组
	let keys1 = Object.keys(obj1)
	let keys2 = Object.keys(obj2)
	//比较keys的个数,若不同,肯定不相等
	if (keys1.length !== keys2.length) return false;
	for (let k of keys1) {
		//递归比较键值对
		let res = isEqual(obj1[k], obj2[k])
		if (!res) return false;
	}
	return true;
}

const obj1 = {
	a: 100,
	b: {
		x: 100,
		y: 200
	}
}
const obj2 = {
	a: 200,
	b: {
		x: 100,
		y: 200
	}
}
console.log(isEqual(obj1, obj2)) //false

菜鸟一只,有不对的地方欢迎指正 . ☺
若有哪里没写明白,欢迎询问,会尽早回答. ☺

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值