判断两组数据是否相似的js函数

开始写博客啦,督促自己学习前端~
编写函数,判断传入的两组数据是否相似,要求判断依据:

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?"通过":"不通过"));

猜你喜欢

转载自blog.csdn.net/Diana24407/article/details/94873453
今日推荐