开始写博客啦,督促自己学习前端~
编写函数,判断传入的两组数据是否相似,要求判断依据:
1、 类型的判断范围,需要区分:String, Boolean, Number, undefined, null, 函数,日期, window
2、如均为数组,则数组长度一致、数组项不分先后顺序类型相同即可,如[1, true] 与 [false, 2]是相似的
我吭哧半天写出来的函数:
<script type="text/javascript">
function arraysSimilar(arr1, arr2){
//判断传入数据的类型
var arr1Type=Object.prototype.toString.apply(arr1);
var arr2Type=Object.prototype.toString.apply(arr2);
//如为同一类型,则判断是否是null或字符串直接比较
if(arr1Type===arr2Type){
if(arr1Type.indexOf('ull')>0&&arr2Type.indexOf('ull')>0){
return false;
}else if(arr1Type.indexOf('tring')>0){
if(arr1!==arr2){
return false;
}else{
return true;
}
}else{
//如为两个数组,先判断长度是否相同
var len1=arr1.length;
var len2=arr2.length;
if(len1===len2){
//将数组中的每一项都转化为其类型的字符串表示,由于输出的是[Object Number]的形式,因此截取字符串的“number”部分,替换原数组项
for(var i=0;i<len1;i++){
var objtype1=Object.prototype.toString.apply(arr1[i]);
var objt1=objtype1.slice(8,objtype1.length-1);
arr1[i]=objt1;
var objtype2=Object.prototype.toString.apply(arr2[i]);
var objt2=objtype2.slice(8,objtype2.length-1);
arr2[i]=objt2;
}
//将两个新数组进行排序
arr1.sort();
arr2.sort();
for(var j=0;j<len1;j++){
if(arr1[j]==arr2[j]){
return true;
}else{
return false;
}
}
}else{
return false;
}
}
}else{
return false;
}
}
</script>
结果看到人家非常简洁的代码:
<script type="text/javascript">
function type(a){
return a === null ? '[object Null]':Object.prototype.toString.apply(a); //hack ie678
}
function arraysSimilar(arr1, arr2){
if(!Array.isArray(arr1) || !Array.isArray(arr2) ||arr1.length!=arr2.length){return false;}
var arr3=[];
var arr4=[];
var x;
for(var i in arr1){
arr3.push(type(arr1[i]));
arr4.push(type(arr2[i]));
}
if(arr3.sort().toString()==arr4.sort().toString()){
return true;
}else{
return false;
}
}
</script>
emmmmmm……
总之,总结一下本次用到的知识点:
1、由于typeof判断不够具体,无法识别Date()、Array()等对象,因此使用Object.prototype.toString.apply()判断数据类型,参考文章
2、对于返回数据类型字符串的处理,str.slice(start,end)(start为开始下标,end下标不截取,取到end前一位);str.indexOf()>0
3、两个数组进行比较,我使用的是sort()方法排序后再次循环每一项进行比较,参考更好的方法是将两个排序后的数组转换为字符串直接比较(arr.toString())
最后放入测试数据及调用:
var result=function(){
//以下为多组测试数据
var cases=[{
arr1:[1,true,null],
arr2:[null,false,100],
expect:true
},{
arr1:[function(){},100],
arr2:[100,{}],
expect:false
},{
arr1:[null,999],
arr2:[{},444],
expect:false
},{
arr1:[window,1,true,new Date(),"hahaha",(function(){}),undefined],
arr2:[undefined,(function(){}),"okokok",new Date(),false,2,window],
expect:true
},{
arr1:[new Date()],
arr2:[{}],
expect:false
},{
arr1:[window],
arr2:[{}],
expect:false
},{
arr1:[undefined,1],
arr2:[null,2],
expect:false
},{
arr1:[new Object,new Object,new Object],
arr2:[{},{},null],
expect:false
},{
arr1:null,
arr2:null,
expect:false
},{
arr1:[],
arr2:undefined,
expect:false
},{
arr1:"abc",
arr2:"cba",
expect:false
}];
//使用for循环, 通过arraysSimilar函数验证以上数据是否相似,如相似显示“通过”,否则"不通过",所以大家要完成arraysSimilar函数,具体要求,详见任务要求。
for(var i=0;i<cases.length;i++){
if(arraysSimilar(cases[i].arr1,cases[i].arr2)!==cases[i].expect) {
document.write("不通过!case"+(i+1)+"不正确!arr1="+JSON.stringify(cases[i].arr1)+", arr2="+JSON.stringify(cases[i].arr2)+" 的判断结果不是"+cases[i].expect);
return false;
}
}
return true;
}();
document.write("判定结果:"+(result?"通过":"不通过"));