本来只打算写一个判断数组的方法,结果发现数组里可能有对象,还得判断两个对象是否相等,然而对象里面也有可能有数组,所以两个方法相辅相成,缺一不可(aa:判断数组,bb:判断对象,本人英语水平有限就不用单词了。另外这里的对比不考虑对象或者数组里面含有function的情况。欢迎指正)
function myTypeOf(obj) { // 判断数据类型
return Object.prototype.toString.call(obj)
}
function bb(obj1, obj2) { // 判断两个对象每一项的值是否相等
var res = true
// debugger
for (var key in obj1) {
var cur = obj1[key]
var type = myTypeOf(cur)
if (type !== myTypeOf(obj2[key])) {
return false
}
if (type.indexOf('Object') > -1) {
for (var k in cur) {
res = bb(cur[k], obj2[k])
if (res === false) {
return false
}
}
} else if (type.indexOf('Array') > -1) {
res = aa(cur, obj2[key])
if (res === false) {
return false
}
} else {
if (cur !== obj2[key]) {
return false
}
}
}
return res
}
function aa(arr1, arr2) { // 判断两个数组每一项的值是否相等
var res = true
// debugger
if (arr1.length !== arr2.length) {
return false
}
for (var i = 0; i < arr1.length; i++) {
var cur = arr1[i]
var type = myTypeOf(cur)
if (type !== myTypeOf(arr2[i])) {
return false
}
if (type.indexOf('Object') > -1) {
res = bb(cur, arr2[i])
if (res === false) {
return false
}
} else if (type.indexOf('Array') > -1) {
res = aa(cur, arr2[i])
if (res === false) {
return false
}
} else {
if (cur !== arr2[i]) {
return false
}
}
}
return res
}
var arr = [1, { a: 1, b: 2 }, 1, [{ a: 1, b: '2', c: true, d: { a: 1, b: 2 } }]]
var arr2 = [1, { b: 2, a: 1 }, [{ a: 1, b: '2', c: true, d: { a: 1, b: 2 } }], 1]
console.log(aa(arr,arr2))