La comparación de profundidad de escritura simula isEqual de Lodash

// 实现效果
let a = { name: 'zfb', age: 18, major: { main: 'math', other: 'chinese'} }
let b = { name: 'zfb', age: 18, major: { main: 'math', other: 'chinese'} }
console.log(a === b) // false

En circunstancias normales, dos objetos no pueden ser iguales, aunque la clave y el valor son iguales, debido a que tienen punteros de memoria diferentes, se implementa la función isEqual

var result = isEqual(a, b)
console.log(result) // true

Código:

Conocimiento previo: Object.keys ()

Si se pasa el objeto, devuelve la matriz de claves del objeto; si la pasada es una matriz, devuelve la matriz de subíndice de índice

let c = { name: 'zfb', age: 18, major: { main: 'math', other: 'chinese'} }
console.log(Object.keys(c)) //  ["name", "age", "major"]

let arr = ['1', '2', '3']
console.log(Object.keys(arr)) // ["0", "1", "2"]

Código:

// 判断是否是对象或者数组
function isObject(obj) {
  return typeof obj === 'object' && obj !== null
}
function isEqual (obj1, obj2) {
  // 参数有一个不是对象 直接判断值是否相等就行
  if (!isObject(obj1) || !isObject(obj2)) {
    return obj1 === obj2
  }
  // 如果两个数都是数组或者对象
  // 1. 先比较keys的个数,如果个数不相同 直接就不想等了
  var obj1Keys = Object.keys(obj1)
  var obj2Keys = Object.keys(obj2)
  if (obj1Keys.length !== obj2Keys.length) {
    return false
  }
  // 如果个数相同再以obj1为基准 和 obj2依次递归比较
  // for...in 适用于对象,也适用于数组
  for (let key in obj1) {
    const res = arguments.callee(obj1[key], obj2[key]) // 递归
    if (!res) {
      return false
    }
  }
  return true
}

Adecuado para matrices y objetos.

Supongo que te gusta

Origin blog.csdn.net/Luckyzhoufangbing/article/details/108882923
Recomendado
Clasificación