判断两个键值对对象是否相等,分两种情况:
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)
}
第二种,两个对象属性相等,但顺序不相同:
- 先写子元素值类型为: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 }
判断子元素类型为: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如何判断两个对象数组是否相等?
今天就到这里,赶紧试试吧