js如何判断两个对象(键值对)是否相等?

时间: 作者:admin 浏览:

判断两个键值对对象是否相等,分两种情况:

1、考虑属性顺序
2、不考虑属性顺序;

考虑属性顺序,即完全相等,那相对简单:

首先,我们先来判断一个对象是否键值对对象;

function isPlainObject(obj){
    return typeof obj === 'object' && Object.prototype.toString.call(obj) === '[object Object]'
}

属性个数是否相同:

function getObjectLen(obj){
    return Object.keys(obj).length
}

第一种,两个对象完全相等(包括属性顺序):

function isEqualObject(obj1, obj2){
    return isPlainObject(obj1) &&
                isPlainObject(obj2) &&
                getObjectLen(obj1) === getObjectLen(obj2) &&
                JSON.stringify(obj1) === JSON.stringify(obj2)
}

第二种,两个对象属性相等,但顺序不相同:

  1. 先写子元素值类型为:Function类型
     /**
     *判断值是否为Function
     */
     function isFunction( fun ){
         return typeof fun === 'function' && Object.prototype.toString.call( fun ) === '[object Function]'
     }
     /**
     **判断两个function是否相等(转为字符串做对比)
     **/
     function isEqualFunction( fun1, fun2){
         if(!isFunction( fun1 ) || !isFunction( fun2 )){
             return fun1 === fun2
         }
         if( String( fun1 ) !== String( fun2 )){
             return false
         }
         return true
     }
    
  2. 判断子元素类型为:Date类型

     /**
     * 判断值是否为Date
     */
     function isDate(obj){
         return typeof obj === 'object' && Object.prototype.toString.call(obj) === '[object Date]'
     }
    
     /**
     * 判断两个Date是否相等
     */
     function isEqualDate( date1, date2){
         if(!isDate( date1 ) || !isDate( date2 )){
             return date1 === date2
         }
         if( date1.getTime() !== date2.getTime()){
             return false
         }
         return true
     }
    

    最终判断两个对象是否相等的方法如下:

     /**
     * @method 复杂对象对比(无序)
     * @param {*} -obj1
     * @param {*} -obj2
     * @property {String | Boolean| Number | Array | Object | Function | Date} obj1.*
     * @property {String | Boolean| Number | Array | Object | Function | Date} obj2.*
     * @return {Boolean}
     */
     function isEqualObject(obj1, obj2){
         if( !isPlainObject(obj1) || !isPlainObject(obj2)  ){
             return obj1 === obj2
         }
         if(getObjectLen(obj1) !== getObjectLen(obj2)){
             return false
         }
         for(let key in obj1){
             if(key === '__proto__' || obj1[key] === obj2){
                 continue
             }
             if( isPlainObject(obj1[key]) && isPlainObject(obj2[key])  ){
                 if(!isEqualObject(obj1[key], obj2[key])){
                     return false
                 }
             }else if( isFunction(obj1[key]) && isFunction(obj2[key]) ){
                 if(!isEqualFunction(obj1[key], obj2[key])){
                     return false
                 }
             }else if(Array.isArray(obj1[key]) && Array.isArray(obj2[key])){
                 //判断两个数组是否相等的方法在文章末尾
                 if(!isEqualArray(obj1[key], obj2[key])){
                     return false
                 }
             }else if( isDate(obj1[key]) && isDate(obj2[key]) ){
                 if( !isEqualDate(obj1[key], obj2[key]) ){
                     return false
                 }
             }else if(obj1[key] !== obj2[key]){
                 return false
             }
         }
         return true
     }
    

    上面的isEqualArray()方法在另一篇文章里:
    js如何判断两个对象数组是否相等?

今天就到这里,赶紧试试吧

微信公众号
微信公众号:
  • 前端全栈之路(微信群)
前端QQ交流群
前端QQ交流群:
  • 794324979
  • 734802480(已满)

更多文章

栏目文章


Copyright © 2014-2023 seozhijia.net 版权所有-粤ICP备13087626号-4