js两个对象之间进行值比较

这篇博客探讨了如何在JavaScript中实现一个名为`equals`的函数,用于深度比较两个对象或函数是否相等。该函数首先检查输入类型,然后根据对象或函数的情况进行递归比较。它支持多个参数,可以比较多个对象对。博客通过示例展示了如何使用这个函数,例如比较对象属性、函数实例等。

 

Object.prototype.equals = function(){
    let type = typeof this
    let allArguments = null
    let result = false
    if(type === 'function' && this instanceof Object){
        console.log('functionaaa')
        if(arguments.length > 1){
            result = true
            for(let i = 0;i <= arguments.length - 2;i++){
                result = equal(arguments[i],arguments[i+1])
                if(!result)break
            }
        }else{
            result = true
        }
    }else if(type === 'object'){
        console.log('functionbbb')
        allArguments = [this,...arguments]
        if(allArguments.length > 1){
            result = true
            for(let i = 0;i <= allArguments.length - 2;i++){
                result = equal(allArguments[i],allArguments[i+1])
                if(!result)break
            }
        }else{
            result = true
        }
    }else{
        result = false
    }

    function equal(a,b){
        let res = true

        if(typeof a !== typeof b)res = false
        if(a instanceof Object && !(a instanceof Array) && res){
            let keys = [...Object.keys(a),...Object.keys(b)]
            for(let i = 0;i<keys.length;i++){
                if(!res)break
                res = equal(a[keys[i]],b[keys[i]])
            }
        }else if(a instanceof Array && res){
            res = a.length === b.length
            for(let i = 0;i<a.length;i++){
                if(!res)break
                res = equal(a[i],b[i])
            }
        }else{
            res = a === b
        }
    
        return res
    }

    return result
}
let a = {a:1}
let b = {}
function c(){return {}}

let q = c.equals(2,2)//let q = c().equals(2,2)
let w = Object.equals({a:1},{a:1},{a:2})
let e = a.equals({a:1},{a:2})

console.log(q,w,e)

 

在JavaScript中,如果需要比较两个对象数组是否相等或查找它们之间的差异,可以采用多种方法。以下是几种常见的思路: ### 1. **基本原理** 对象数组是由多个对象组成的集合,直接通过 `===` 或其他简单比较符无法判断两组数据内容上的一致性,因为每个对象都属于独立引用类型。 --- ### 2. **逐项深度比较** ```javascript function compareObjectArrays(array1, array2) { // 如果长度不同,则可以直接判定不一致 if (array1.length !== array2.length) return false; for (let i = 0; i < array1.length; i++) { const obj1 = JSON.stringify(array1[i]); const obj2 = JSON.stringify(array2[i]); // 比较序列化后的字符串版本 if (obj1 !== obj2) return false; } return true; } // 示例: const arr1 = [{ id: 1, name: "Alice" }, { id: 2, name: "Bob" }]; const arr2 = [{ id: 1, name: "Alice" }, { id: 2, name: "Bob" }]; console.log(compareObjectArrays(arr1, arr2)); // 输出true ``` 此方法适用于简单的场景,并依赖于JSON转换过程不会丢失信息的前提条件。然而它对于循环引用等问题并不安全。 --- ### 3. **基于键对的递归检查** 若需更精确地控制字段级别对比,可以编写自定义函数逐一比对属性: ```javascript function deepEqual(objA, objB){ let keysA = Object.keys(objA), keysB = Object.keys(objB); if(keysA.length != keysB.length){return false;} for(let key of keysA){ if(typeof objA[key]==='object'&& typeof objB[key] === 'object'){ if(!deepEqual(objA[key], objB[key])){return false;} }else{ if(String(objA[key])!==String(objB[key])){ return false; } } } return true; } function arraysAreIdentical(arr1,arr2){ if(arr1.length!=arr2.length)return false; for(var index=0 ;index<arr1.length; ++index ){ if(!deepEqual(arr1[index], arr2[index])){ return false ; } } return true; } ``` 上述示例实现了更为深入细致的数据结构匹配策略。 --- ### 4. 使用库简化操作 实际项目开发当中也可以借助第三方工具包如Lodash来进行高效处理: ```bash npm install lodash ``` 然后引入lodash模块并利用其中提供的_.isEqual()辅助功能即可完成任务: ```js import _ from 'lodash'; const result = _.isEqual([{id:"test"}],[{"id":"test"}]); // returns boolean value. ``` 这种方式不仅简洁而且可靠准确度高,推荐优先选用成熟的开源方案减少维护成本。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值