美文网首页
手写深度比较,模拟lodash的isEqual

手写深度比较,模拟lodash的isEqual

作者: 泡杯感冒灵 | 来源:发表于2020-07-25 11:35 被阅读0次

要实现的效果

  • 两个对象,属性完全一样,就返回true,有一点不一样就返回false
const obj1  = {a:100,b:{x:10,y:20}}
const obj2  = {a:100,b:{x:10,y:20}}
isEqual(obj1,obj2)   ===  true

//实现
//判断是否是对象或数组
function isObject(obj) {
    return typeof obj === 'object' && obj !== null
}

function isEqual(obj1,obj2) {
  // 两个数据有任何一个不是对象或数组
  if (!isObject(obj1) || !isObject(obj2)) {
    // 值类型(注意:参与equal的一般不会是函数)
    return obj1 === obj2
  }
  // 如果传的两个参数都是同一个对象或数组
  if (obj1 === obj2) {
    return true
  }

  // 两个都是对象或数组,而且不相等
  // 1.先比较obj1和obj2的key的个数,是否一样
  const obj1Keys = Object.keys(obj1)
  const obj2Keys = Object.keys(obj2)
  if (obj1Keys.length !== obj2Keys.length) {
    return false
  }

  // 如果key的个数相等,就是第二步
  // 2.以obj1为基准,和obj2依次递归比较
  for (let key in obj1) {
    // 比较当前key的value  --- 递归
    const res = isEqual(obj1[key], obj2[key])
    if (!res) {
      return false
    }
  }

  // 3.全相等
  return true
}

const arr1 = [1, 2, 3]
const arr2 = [1,2,3,4]
console.log(isEqual(arr1,arr2))  // false

相关文章

网友评论

      本文标题:手写深度比较,模拟lodash的isEqual

      本文链接:https://www.haomeiwen.com/subject/pqsplktx.html