手書きの深さの比較は、lodashのisEqualをシミュレートします

// 实现效果
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

通常の状況では、2つのオブジェクトを等しくすることはできませんが、キーと値は同じですが、メモリポインターが異なるため、isEqual関数が実装されています

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

コード:

事前知識:Object.keys()

オブジェクトが渡された場合は、オブジェクトのキー配列を返します。渡されたものが配列の場合は、インデックス添え字配列を返します。

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"]

コード:

// 判断是否是对象或者数组
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
}

アレイとオブジェクトに適しています

おすすめ

転載: blog.csdn.net/Luckyzhoufangbing/article/details/108882923