js判断两个对象是否相等---2种方式
1、JSON.stringify(obj)
这种方法,简单一行代码就搞定。
但有一个缺点:当对象里key值的顺序不一致时,比较就会出问题了。并且在JSON.stringify()时,一些特殊类型的值,比如undefined
,Date
,RegExp
等会丢失或者变形。
var obj1={
name:111,
age:222,
dis:[1,2,3,4],
info:{
like:"hx",
arr:[1,2,3,4]
}
}
var obj2={
name:111,
age:222,
dis:[1,2,3,4],
info:{
like:"hx",
arr:[1,2,3,4]
}
}
console.log(JSON.stringify(obj1)==JSON.stringify(obj2));
2、递归
使用递归来判断两个对象是否相等。现有对象
obj1
和obj2
对象里,值的类型包括undefined
、null
、number
、string
、boolean
、Date
、Array
和对象。数组项也有可能是简单类型、数组甚至对象 。
默认输入的两个参数是对象了,就不做判断了。。。。。。。。
2.1、实现思路
- 先判断两个对象的key值的长度。若长度不相等,则
return false
- 遍历对象
obj1
,检查对象obj2
中是否有对应的key值, 没有,则return false
- 比较两个对象中这个key对应的值的类型是否相等,不相等,则
return false
- 如果值的类型是
undefined
、number
、string
、boolean
的一种,直接两个值比较,不同,则return false
- 如果值是
null
,那么 比较两个值是否相等。不等,则return false
- 如果值是
Date
类型的, - 如果值是对象,调用自身
- 如果值是数组,因为数组项可能是任意一种数据类型的,所以还是先比较长度,长度相等后再逐一比较数组的每一项。
2.2、代码部分
var obj1 = {
name: 111,
age: 222,
arr: [1, 2, 3, 4],
info: {
name: "iii",
arr: [1, 2, 3, [1, 2], { name: 222 }]
}
}
var obj2 = {
name: 111,
arr: [1, 2, 3, 4],
age: 222,
info: {
name: "iii",
arr: [1, 2, 3, [1, 2], { name: 222 }]
}
}
// 假设对象内值的类型有:undefined、null、string、boolean、number、对象、数组和Date
function objEqual(obj1, obj2) {
let flag = true;
// 先判断,key的长度是否相等,
if (Object.getOwnPropertyNames(obj1).length !== Object.getOwnPropertyNames(obj2).length) {
return false;
}
for (let key in obj1) {
// 先看看 两个对象中是否都包含这个key
if (!obj2.hasOwnProperty(key)) { // obj2 没有这个key
return false;
}
const type1 = typeof obj1[key];
const type2 = typeof obj2[key];
if (type1 !== type2) { // 有这个key,但是 值的类型不同
return false;
}
flag = judge(obj1, obj2, key, type1, type2);
if (!flag) {
return false;
}
}
return true;
}
function judge(obj1, obj2, key, type1, type2) {
let flag = true;
if (type1 === "string" || type1 === "number" || type1 === "boolean" || type1 === "undefined") { // 如果值 是简单类型,
if (obj1[key] !== obj2[key]) {
flag = false;
}
} else if (type1 === "object" && obj1[key] === null) { // 如果值是 null
if (obj2[key] !== null) {
flag= false;
}
} else if (type1 === "object" && type1 instanceof Date) { // 如果值 是日期
if (!type2 instanceof Date) {
flag = false;
}
if (obj1[key] !== obj2[key]) {
flag = false;
}
} else if (type1 === "object" && !Array.isArray(obj1[key])) { // 如果值 是个对象
if (Array.isArray(obj2[key])) { //
flag = false;
} else {
const result = objEqual(obj1[key], obj2[key]);
flag = result;
}
} else if (type1 === "object" && Array.isArray(obj1[key])) { // 值是数组
if (!Array.isArray(obj2[key])) {
return false;
} else if (obj1[key].length !== obj2[key].length) { // 数组项项数不一样啊
return false;
} else {
for (let i = 0; i < obj1[key].length; i++) {
const type11 = typeof obj1[key][i];
const type22 = typeof obj2[key][i];
//arr: [1, 2, [1, 2, 3], { name: 554 }]
const result = judge(obj1[key], obj2[key], i, type11, type22);
if(!result){
return result
}
flag = result;
}
}
}
return flag;
}
const result = objEqual(obj1, obj2);
console.log(result, "--------------两个对象是否相等");
2.3 测试数据
// 1----true
var obj1 = {
name: 111,
age: 222,
}
var obj2 = {
name: 111,
age: 222,
}
// 2---true
var obj1 = {
name: 111,
hi:new Date(),
age: 222,
}
var obj2 = {
name: 111,
age: 222,
hi:new Date()
}
// 3---false
var obj1 = {
name: 111,
hi:new Date(),
}
var obj2 = {
name: 111,
age: 222,
hi:new Date()
}
// 4---true
var obj1 = {
name: 111,
hi:new Date(),
age:222,
arr: [1, 2, 3, 4],
}
var obj2 = {
name: 111,
age: 222,
hi:new Date(),
arr: [1, 2, 3, 4],
}
// 5---false
var obj1 = {
name: 111,
hi:new Date(),
age:222,
arr: [1, 2, 2, 4],
}
var obj2 = {
name: 111,
age: 222,
hi:new Date(),
arr: [1, 2, 3, 4],
}
// 6---false
var obj1 = {
name: 111,
hi:new Date(),
age:222,
arr: [1, 2, 2, 4],
info: {
name: "ii8i",
}
}
var obj2 = {
name: 111,
age: 222,
hi:new Date(),
arr: [1, 2, 3, 4],
info: {
name: "iii",
}
}
// 7---false
var obj1 = {
name: 111,
hi:new Date(),
age:222,
arr: [1, 2, 2, 4],
info: {
name: "ii8i",
arr: [1, 2, 3, [1, 2] ]
}
}
var obj2 = {
name: 111,
age: 222,
hi:new Date(),
arr: [1, 2, 3, 4],
info: {
name: "iii",
arr: [1, 2, 3, [1, 2], { name: 222 }]
}
}
// 8---true
var obj1 = {
name: 111,
hi:new Date(),
age:222,
arr: [1, 2, 3, 4],
info: {
name: "iii",
arr: [1, 2, 3, [1, 2] ,{ name: 222 }]
}
}
var obj2 = {
name: 111,
age: 222,
hi:new Date(),
arr: [1, 2, 3, 4],
info: {
name: "iii",
arr: [1, 2, 3, [1, 2], { name: 222 }]
}
}
还没有评论,来说两句吧...