实现两个相似数组,长度一致并且数组中的成员类型相同,但顺序可以不同。例如[1, true] 与 [false, 2]是相似的。类型可以区分String, Boolean, Number, undefined, null, 函数,日期,正则,对象 window.
function arraysSimilar(arr1, arr2){
let boo = true;
if(arr1 instanceof Array && arr2 instanceof Array){
if(arr1.length !== arr2.length) {
boo = false;
return '判定结果:不通过';
}
let typeArr1=[], sArr1='';
function _push(v) {
typeArr1.push(v);
sArr1+=v;
}
let typeArr2=[], sArr2='';
function _push2(v) {
typeArr2.push(v);
sArr2+=v;
}
arr1.forEach(val=> {
if(typeof val === 'Object'){
if(val === null) {
_push('null')
} else if(val === window){
_push('window')
} else {
_push(Object.prototype.toString.call(val).slice(8, -1))
}
} else if(typeof val === 'function'){
if(val === Date) {
_push('Date')
} else {
_push('function')
}
} else {
_push(typeof val)
}
})
arr2.forEach(val=> {
if(typeof val === 'Object'){
if(val === null) {
_push2('null')
} else if(val === window){
_push2('window')
} else {
_push2(Object.prototype.toString.call(val).slice(8, -1))
}
} else if(typeof val === 'function'){
if(val === Date) {
_push2('Date')
} else {
_push2('function')
}
} else {
_push2(typeof val)
}
})
typeArr1.forEach(v => {
if(!sArr2.includes(v)) {
boo = false;
}
})
typeArr2.forEach(v => {
if(!sArr1.includes(v)) {
boo = false;
}
})
if(boo) { return '判定结果:通过'}
else{
return '判定结果:不通过';
}
} else {
return '判定结果:不通过';
}
}