JSON.stringify ([{N: 1}]) == JSON.stringify ([{N: "1"}]) results fasle
JSON.stringify ([{N: 1}]) === JSON.stringify ([{N: "1"}]) result is false
JSON.stringify ([{N: 1}]) === JSON.stringify ([{N: 1}]) result is true
By some cases JSON.stringify can not determine whether the correct ojb == obj
So made the following determination method
deep = false == determination is performed
deep = true === determination is performed
For deep = true determination can be modified JSON.stringify judgment, but with the unsorted array misjudgment occurs
function objIsEqual(obj1, obj2, deep = false) {
let result = false;
arrTransmit(obj1, obj2, deep);
function isArray(it) {
return Object.prototype.toString.call(it) === '[object Array]';
}
function isObject(it) {
return Object.prototype.toString.call(it) === '[object Object]';
}
function isEqual(v1, v2, deep) {
if (!deep) {
if (v1 == v2) return true;
} else {
if (v1 === undefined && v2 === undefined) return true;
if (v1 === null && v2 === null) return true;
if (v1 === v2) return true;
}
return false;
}
function arrTransmit(obj1, obj2, deep, tag = 'value') {
if (isArray(obj1) && isArray(obj2)) {
if (obj1.length !== obj2.length) {
return false;
} else {
let i;
obj1.sort();
obj2.sort();
for (i = 0; i < obj1.length; i++) {
if (tag === 'key') {
if (arrTransmit(obj1[i], obj2[i], deep, 'key') !== 'key') {
result = false;
return false;
}
} else {
if (!arrTransmit(obj1[i], obj2[i], deep, 'value')) {
result = false;
return false;
}
}
}
}
} else if (isObject(obj1) && isObject(obj2)) {
if (!objTransmit(obj1, obj2, deep)) {
return false;
}
} else {
result = isEqual(obj1, obj2, deep);
if(!result){
return false;
}
}
if (tag == 'key') {
return 'key'
} else {
return true;
}
}
function objTransmit(obj1, obj2, deep) {
let k1 = Object.keys(obj1), k2 = Object.keys(obj2);
let v1 = Object.values(obj1), v2 = Object.values(obj2);
if (k1.length !== k2.length) {
return false;
}
if (arrTransmit(k1.sort(), k2.sort(), deep, 'key') === 'key') {
if (!arrTransmit(v1.sort(), v2.sort(), deep, 'value')) {
return false;
}
} else {
return false;
}
return true;
}
return result;
}
console.log(this.objIsEqual({house: [111, 222], device: [11, 22, 33, 44]}, {house: [111], device: [11]}))
console.log(this.objIsEqual({house: [111, 222], device: [11, 22, 33, 44]}, {
house: [111, 222],
device: [11, 22, 33, 44]
}))
console.log(this.objIsEqual(1, 1))
console.log(this.objIsEqual(null, undefined))
console.log(this.objIsEqual(1, '1', true))
console.log(this.objIsEqual([2, 3, 5], [5, 3, 2]))
console.log(this.objIsEqual([2, 3, 5], [5, 3, "2"], true))