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

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

🌠 希望能够帮助到你

相关文章
|
1月前
|
JavaScript 前端开发
JavaScript Date(日期) 对象
JavaScript Date(日期) 对象
38 2
|
5天前
|
Web App开发 JavaScript 前端开发
如何确保 Math 对象的方法在不同的 JavaScript 环境中具有一致的精度?
【10月更文挑战第29天】通过遵循标准和最佳实践、采用固定精度计算、进行全面的测试与验证、避免隐式类型转换以及持续关注和更新等方法,可以在很大程度上确保Math对象的方法在不同的JavaScript环境中具有一致的精度,从而提高代码的可靠性和可移植性。
|
1天前
|
JavaScript 前端开发
如何在 JavaScript 中使用 __proto__ 实现对象的继承?
使用`__proto__`实现对象继承时需要注意原型链的完整性和属性方法的正确继承,避免出现意外的行为和错误。同时,在现代JavaScript中,也可以使用`class`和`extends`关键字来实现更简洁和直观的继承语法,但理解基于`__proto__`的继承方式对于深入理解JavaScript的面向对象编程和原型链机制仍然具有重要意义。
|
5天前
|
JavaScript 前端开发 图形学
JavaScript 中 Math 对象常用方法
【10月更文挑战第29天】JavaScript中的Math对象提供了丰富多样的数学方法,涵盖了基本数学运算、幂运算、开方、随机数生成、极值获取以及三角函数等多个方面,为各种数学相关的计算和处理提供了强大的支持,是JavaScript编程中不可或缺的一部分。
|
1月前
|
前端开发 JavaScript
JavaScript递归菜单栏
JavaScript递归菜单栏
JavaScript递归菜单栏
|
29天前
|
存储 JavaScript 前端开发
JavaScript 对象的概念
JavaScript 对象的概念
35 4
|
28天前
|
缓存 JavaScript 前端开发
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
29 1
|
28天前
|
存储 JavaScript 前端开发
js中函数、方法、对象的区别
js中函数、方法、对象的区别
15 2
|
1月前
|
JavaScript 前端开发 Unix
Node.js 全局对象
10月更文挑战第5天
21 2
|
1月前
|
存储 JavaScript 前端开发
js中的对象
js中的对象
18 3