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;
            }
  • 相关阅读:
    编写好代码的10条戒律
    [Project] 基开放云平台
    [Project] HUSTOJ随笔
    编码规范:大家都应该做的事情
    ural 1167. Bicolored Horses 夜
    1709. PenguinAvia 夜
    hdu 1011 Starship Troopers 夜
    hdu 2571 命运 夜
    hdu 1561 The more, The Better 夜
    hdu 1598 find the most comfortable road 夜
  • 原文地址:https://www.cnblogs.com/n2meetu/p/javascript.html
Copyright © 2011-2022 走看看