【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
}

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

🌠 希望能够帮助到你

相关文章
|
12天前
|
存储 JavaScript 前端开发
|
13天前
|
JavaScript 前端开发 网络架构
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
17 1
|
14天前
|
存储 JavaScript 前端开发
JavaScript 对象
JavaScript 对象
12 1
|
17天前
|
JavaScript Java 数据安全/隐私保护
js对象可扩展性和属性的四个特性(下)
js对象可扩展性和属性的四个特性(下)
|
18天前
|
JavaScript 前端开发 算法
虚拟DOM是React的关键技术,它是个轻量的JS对象树,模拟实际DOM结构。
【6月更文挑战第27天】虚拟DOM是React的关键技术,它是个轻量的JS对象树,模拟实际DOM结构。当状态改变,React不直接修改DOM,而是先构建新的虚拟DOM树。通过 diff 算法比较新旧树,找到最小变更,仅更新必要部分,提高性能,避免频繁DOM操作。虚拟DOM还支持跨平台应用,如React Native。它优化了更新流程,简化开发,并提升了用户体验。
20 1
|
6天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的公共交通查询系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的公共交通查询系统附带文章源码部署视频讲解等
8 0
|
6天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的城市公交查询系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的城市公交查询系统附带文章源码部署视频讲解等
9 0
|
6天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的武汉市公交路线查询系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的武汉市公交路线查询系统附带文章源码部署视频讲解等
10 0
|
7天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的城市公交在线查询系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的城市公交在线查询系统附带文章源码部署视频讲解等
9 0
|
7天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的高校竞赛和考级查询系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的高校竞赛和考级查询系统附带文章源码部署视频讲解等
7 0