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

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

🌠 希望能够帮助到你

相关文章
|
8天前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
19 3
|
11天前
|
JavaScript 前端开发 开发者
JavaScript的`Math`对象
【4月更文挑战第21天】JavaScript的`Math`对象
18 3
|
3天前
|
前端开发 JavaScript 数据安全/隐私保护
前端javascript的DOM对象操作技巧,全场景解析(二)
前端javascript的DOM对象操作技巧,全场景解析(二)
|
3天前
|
移动开发 缓存 JavaScript
前端javascript的DOM对象操作技巧,全场景解析(一)
前端javascript的DOM对象操作技巧,全场景解析(一)
|
3天前
|
缓存 编解码 自然语言处理
前端javascript的BOM对象知识精讲
前端javascript的BOM对象知识精讲
|
3天前
|
JavaScript 前端开发
JavaScript 日期对象
JavaScript 日期对象
|
3天前
|
存储 JavaScript 前端开发
|
3天前
|
JavaScript 前端开发
JavaScript的math对象
JavaScript的math对象
|
3天前
|
JavaScript 前端开发
JavaScript DOM 文档对象模型(获取、改变html元素)
JavaScript DOM 文档对象模型(获取、改变html元素)
|
3天前
|
JavaScript 前端开发
【专栏】Javascript 对象的深浅拷贝
【4月更文挑战第29天】JavaScript中的对象拷贝分为浅拷贝和深拷贝。浅拷贝仅复制对象引用,修改拷贝会影响原始对象,如使用直接赋值、`Object.assign()`、扩展运算符和`Array.prototype.concat()`。深拷贝则创建独立副本,修改不影响原始对象,可通过递归、`JSON.stringify()`和`JSON.parse()`、Lodash的`cloneDeep()`或jQuery的`jQuery.extend()`实现。