zoukankan      html  css  js  c++  java
  • Javascript 判断传入的两个数组是否相似

    任务描述:

      请在index.html文件中,编写arraysSimilar函数,实现判断传入的两个数组是否相似。具体需求:

    
    

      1. 数组中的成员类型相同,顺序可以不同。例如[1, true] 与 [false, 2]是相似的。

    
    

      2. 数组的长度一致。

    
    

      3. 类型的判断范围,需要区分:String, Boolean, Number, undefined, null, 函数,日期, window.

      当以上全部满足,则返回"判定结果:通过",否则返回"判定结果:不通过"

    思路:1.判断两个数组的长度是否相同。否则,返回false

       2.定义两个新数组,用来储存 arr1 和 arr2 的各种成员类型

       (用到 push()方法和 call()方法,后者在本处的用处是,用Object.prototype.toString方法获得的对象 代替 arr1[i],即最后push到arrType1中的是arr1[i]的成员类型,如Array、num、function等等,而不是原本具体的数据之类的。)

       3.排序后,用“==”进行比较。

    方法一:
    <!
    DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>判断类型</title> <script> /* * param1 Array * param2 Array * return true or false */ function arraysSimilar(arr1, arr2){ var arrType1=[]; var arrType2=[]; // 判断是否是数组 if(!(arr1 instanceof Array&&arr2 instanceof Array)){ return false; } // 长度是否相同 if(arr1.length!=arr2.length){ return false; } // 判断类型是否相同 for( var i=0; i<arr1.length; i++){ arrType1.push(Object.prototype.toString.call(arr1[i]));//x.call(y)即用x对象代替y对象 arrType2.push(Object.prototype.toString.call(arr2[i])); } if(arrType1.sort().toString()== arrType2.sort().toString()){//sort方法:如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。 return "通过"; }else{ return "不通过"; } } </script> </head> <body> </body> </html>


    测试样例:
    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?"通过":"不通过"));
    View Code
    
    

     但是存在一个问题:最后,用if(arrType1.sort().toString()== arrType2.sort().toString())进行判断,但是toString()方法适合内置类型和基本元素。遇到 null 和 undefined 失效。(在IE6/7/8都会返回object)

              内置对象:Date,Array,String,Math 四种。

              基本类型:number,string, boolean,null,undefined,object

    方法二:

            function arraysSimilar(arr1, arr2){
                if(arr1 instanceof Array && arr2 instanceof Array){
                    var key1 = [],key2 = [],len = arr1.length,len2=arr2.length;
                    // 数组的长度相等判断
                    if(len!=len2){return false;}
                    // 类型相同判断
                    if(len){
                        // 获取类型列表
                        for(var i= 0;i<len;i++){
                            // 数组1的类型列表字串
                            var item1 = arr1[i], typeFirst = typeOf(item1);
                            if(key1.join().indexOf(typeFirst)<0){// join()方法用于把数组中的所有元素放入一个字符串。   if(该类型一次都没出现)
                                key1.push(typeFirst);// indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置,返回的是位置对应的序号
                            }
    
                            // 数组2的类型列表字串
                            var item2 = arr2[i],typeSecond = typeOf(item2);
                            if(key2.join().indexOf(typeSecond)<0){
                                key2.push(typeSecond);
                            }
                        }
                        key1 = key1.sort();
                        key2 = key2.sort();
                        // 类型字串比较
                        if(key1.join() == key2.join()){
                            return true;
                        }else{
                            return false;
                        }
                    }else{
                        // 空数组相等
                        return true;
                    }
                }else{
                    // 非数组
                    return false;
                }
    
            }


         function typeOf(item){
                var type = typeof item;
                if(type != "object"){
                    // 判断基本类型string,function,boolean,number,undefine
                }else if(item === null){
                    // check null
                    type = "null";
                }else if(item === window){
                    // check window
                    type ="window";
                }else{
                    // 判断object类型object,date,array
                    if(item instanceof Date){
                        type = "date";
                    }else if(item instanceof Array){
                        type = 'array';
                    }else{
                        type = 'object';
                    }
                }
                return type;
            }
  • 相关阅读:
    Understanding about Baire Category Theorem
    Isometric embedding of metric space
    Convergence theorems for measurable functions
    Mindmap for "Principles of boundary element methods"
    Various formulations of Maxwell equations
    Existence and uniqueness theorems for variational problems
    Kernels and image sets for an operator and its dual
    [loj6498]农民
    [luogu3781]切树游戏
    [atAGC051B]Three Coins
  • 原文地址:https://www.cnblogs.com/n2meetu/p/javascript.html
Copyright © 2011-2022 走看看