【JavaScript 递归】判断两个对象的键值是否完全一致,支持深层次查询,教你玩转JavaScript脚本语言

简介: 【JavaScript 递归】判断两个对象的键值是否完全一致,支持深层次查询,教你玩转JavaScript脚本语言


🎃 自荐一下我写的一个 npm包

此包名为 objects-comparison, 可以进行两个对象的浅判断以及深判断,若两个对象有任意一个地方不同,则返回 false,反之为true, 我们可以用来判断一些平常碰不太到的问题,此包使用的就是递归语法

下载包

npm install objects-comparison

// 引入包
import { objectComparison } from 'objects-comparison'
// 使用包
objectComparison(obj1, obj2); // true / false

🌕 起因

记得当时我是有写过一个判断两个对象内的键值手否相同的文章

使用 md5-js 判断两个对象键值是否相同

但是当时比较菜,递归也看不太懂,所以就用了别人的包

🌓 代码流程

💨 💨💨 首先明确一下需求

首先要有两个 Object

封装一个方法来判断两个对象内的keys,并且要支持深层次判断

⭐ 第一步 判断两个对象的长度是否一致

首先 声明一个判断对象的方法,我们就叫他 objectsComparison,提供两个形参: obj_one,obj_two

理一下思路:既然要判断两个对象中的每一项 且 每一项中的深层次对象都一致的话

1.⚡先判断两个对象keys的长度是否相同

function objectsComparison(obj_one, obj_two) {
  // 判断两个对象的key长度是否一致,若不一致返回false
    // 此时 key 长度不会监听到深层次的key
    if (Object.keys(obj_one).length !== Object.keys(obj_two).length) {
    return false
  }
}

⭐ 第二步 循环 obj 进行判断两个对象

  1. ⚡判断两个对象的 prop 是否为 object
function objectsComparison(obj_one, obj_two) {
  // 判断两个对象的key长度是否一致,若不一致返回false
    // 此时 key 长度不会监听到深层次的key
    if (Object.keys(obj_one).length !== Object.keys(obj_two).length) {
    return false
  }
  // 循环对象,判断每一项
    for (let prop in obj_one) {
        // 判断两个对象每一项是否为object
        if (typeof obj_one[prop] === 'object' && typeof obj_two[prop] === 'object') {
        } 
    }
}

⭐ 第三步 递归条件判断两个对象深层次对象

  1. ⚡递归条件判断两个对象的深层次对象是否符合本方法的所有条件,若不符合,返回false
function objectsComparison(obj_one, obj_two) {
  // 判断两个对象的key长度是否一致,若不一致返回false
    // 此时 key 长度不会监听到深层次的key
    if (Object.keys(obj_one).length !== Object.keys(obj_two).length) {
    return false
  }
  // 循环对象,判断每一项
    for (let prop in obj_one) {
        // 判断两个对象每一项是否为object
        if (typeof obj_one[prop] === 'object' && typeof obj_two[prop] === 'object') {
            // 使用递归条件监听两个深层次的对象
            if (!objectsComparison(obj_one[prop], obj_two[prop])) {
        return false
        }
        } 
    }
}

⭐ 第四步 判断两个对象的值是否相同

  1. ⚡判断两个对象值是否相同,不相同返回false
function objectsComparison(obj_one, obj_two) {
  // 判断两个对象的key长度是否一致,若不一致返回false
    // 此时 key 长度不会监听到深层次的key
    if (Object.keys(obj_one).length !== Object.keys(obj_two).length) {
    return false
  }
  // 循环对象,判断每一项
    for (let prop in obj_one) {
        // 判断两个对象每一项是否为object
        if (typeof obj_one[prop] === 'object' && typeof obj_two[prop] === 'object') {
            // 使用递归条件监听两个深层次的对象
            if (!objectsComparison(obj_one[prop], obj_two[prop])) {
        return false
        }
        // 对象键不相等,也会返回false
        } else if (obj_one[prop] !== obj_two[prop]) {
      return false
    }
    }
}

⭐ 第五步 若以上步骤都不符合,返回true

function objectsComparison(obj_one, obj_two) {
    // 判断两个对象的key长度是否一致,若不一致返回false
    // 此时 key 长度不会监听到深层次的key
    if (Object.keys(obj_one).length !== Object.keys(obj_two).length) {
        return false
    }
    // 循环对象,判断每一项
    for (let prop in obj_one) {
        // 判断两个对象每一项是否为object
        if (typeof obj_one[prop] === 'object' && typeof obj_two[prop] === 'object') {
           // 使用递归条件监听两个深层次的对象
           if (!objectsComparison(obj_one[prop], obj_two[prop])) {
               return false
           }
           // 对象键不相等,也会返回false
        } else if (obj_one[prop] !== obj_two[prop]) {
            return false
        }
    }
    // 若以上条件都不成立,返回true,两个对象完全一致
    return true
}

🌑 完整代码

function objectsComparison(obj_one, obj_two) {
    if (Object.keys(obj_one).length !== Object.keys(obj_two).length) {
        return false
    }
    for (let prop in obj_one) {
        if (typeof obj_one[prop] === 'object' && typeof obj_two[prop] === 'object') {
           if (!objectsComparison(obj_one[prop], obj_two[prop])) {
               return false
           }
        } else if (obj_one[prop] !== obj_two[prop]) {
            return false
        }
    }
    return true
}

🌠 以上是 使用递归 判断连个对象是否完全一致的判断方法

🌠 希望能够帮助到你

相关文章
|
17小时前
|
JavaScript 前端开发
js用Date对象处理时间
以上就是JavaScript中Date对象处理时间的一些基本方法。
5 0
|
17小时前
|
JavaScript 前端开发
在JavaScript中,函数原型(Function Prototype)是一个特殊的对象
【5月更文挑战第11天】JavaScript中的函数原型是一个特殊对象,它为所有函数实例提供共享的方法和属性。每个函数在创建时都有一个`prototype`属性,指向原型对象。利用原型,我们可以向所有实例添加方法和属性,实现继承。例如,我们定义一个`Person`函数,向其原型添加`greet`方法,然后创建实例`john`和`jane`,它们都能调用这个方法。尽管可以直接在原型上添加方法,但推荐在构造函数内部定义以封装数据和逻辑。
10 2
|
17小时前
|
JavaScript 前端开发
JavaScript 提供了多种方法来操作 DOM(文档对象模型)
【5月更文挑战第11天】JavaScript 用于DOM操作的方法包括获取元素(getElementById, getElementsByClassName等)、修改内容(innerHTML, innerText, textContent)、改变属性、添加/删除元素(appendChild, removeChild)和调整样式。此外,addEventListener用于监听事件。注意要考虑兼容性和性能当使用这些技术。
6 2
|
17小时前
|
存储 JavaScript 前端开发
JavaScript对象方法详解
JavaScript对象方法详解
16 1
|
17小时前
|
JavaScript
js多维数组去重并使具有相同属性的对象数量相加
js多维数组去重并使具有相同属性的对象数量相加
11 1
|
17小时前
|
前端开发 JavaScript 数据安全/隐私保护
前端javascript的DOM对象操作技巧,全场景解析(二)
前端javascript的DOM对象操作技巧,全场景解析(二)
|
17小时前
|
移动开发 缓存 JavaScript
前端javascript的DOM对象操作技巧,全场景解析(一)
前端javascript的DOM对象操作技巧,全场景解析(一)
|
17小时前
|
缓存 编解码 自然语言处理
前端javascript的BOM对象知识精讲
前端javascript的BOM对象知识精讲
|
17小时前
|
JavaScript 前端开发
JavaScript 日期对象
JavaScript 日期对象
|
17小时前
|
存储 JavaScript 前端开发
JavaScript对象
JavaScript对象