问答详情
源自:-

第一章_数据类型_练习题解析

该编程题目主要考察对数据类型判断的处理。题目要求正确区分基本类型,同时对象类型也有多种区分,所以使用typeof不能满足条件,需要自己扩展。


以下为一种解法:

/**
 * String, Boolean, Number, undefined, null, 函数,日期, window
 */
function arraysSimilar(arr1, arr2) {
    // 判断参数,确保arr1, arr2是数组,若不是直接返回false
    if (!(arr1 instanceof Array)
        || !(arr2 instanceof Array)) {
        return false;
    }

    // 判断长度
    if (arr1.length !== arr2.length) return false;

    var i = 0, 
        n = arr1.length, 
        countMap1 = {},  // 用来计算数组元素数据类型个数的map,key是TYPES中的类型字符串,value是数字表示出现次数。
        countMap2 = {},
        t1, t2,
        TYPES = ['string', 'boolean', 'number', 'undefined', 'null',
            'function', 'date', 'window'];

    // 因为是无序的,用一个对象来存储处理过程。key为类型, value为该类型出现的次数。
    // 最后校验:若每一种数据类型出现的次数都相同(或都不存在),则证明同构。
    for (; i < n; i++) {
        t1 = typeOf(arr1[i]);
        t2 = typeOf(arr2[i]);
        if (countMap1[t1]) {
            countMap1[t1]++;
        } else {
            countMap1[t1] = 1;
        }
        if (countMap2[t2]) {
            countMap2[t2]++;
        } else {
            countMap2[t2] = 1;
        }
    }

    // 因为typeof只能判断原始类型,且无法判断null(返回"object"),所以自己写typeof方法扩展。
    function typeOf(ele) {
        var r;
        if (ele === null) r = 'null'; // 判断null
        else if (ele instanceof Array) r = 'array';  // 判断数组对象
        else if (ele === window) r = 'window';  // 判断window
        else if (ele instanceof Date) r = 'date'  // 判断Date对象
        else r = typeof ele; // 其它的,使用typeof判断
        return r;
    }

    for (i = 0, n = TYPES.length; i < n; i++) {
        if (countMap1[TYPES[i]] !== countMap2[TYPES[i]]) {
            return false;
        }
    }

    return true;
}


请结合注释去看就好,有问题回帖。

另外也给网友XadillaX提供的较为精妙的解法:

var global = window;
function arraysSimilar(arr1, arr2){
    return (arr1 instanceof Array && arr2 instanceof Array) && JSON.stringify(arr1.map(function(v) {
        return null === v ? "☀" : (v instanceof Date ? "❤" : (v === global ? "❀" : typeof v));
    }).sort()) === JSON.stringify(arr2.map(function(v) {
        return null === v ? "☀" : (v instanceof Date ? "❤" : (v === global ? "❀" : typeof v));
    }).sort());
}


提问者:Bosn 2015-01-12 20:31

个回答

  • qq_随风_179
    2018-01-14 14:50:00

    如何将数组的每个值与另一数组的所有值做比较,肯定要双重for,其他不知道

  • qq_随风_179
    2018-01-14 14:48:33

    for(i=0,i<arr1.length, i++){
              for(j=0,j<arr2.enght,i++){
    objet.prototype.class(array1【i】)=objet.prototype.class(array2【j】)
    }
    }

  • __没有人
    2017-04-01 15:20:30

    function array(arr1,arr2){
     
      if(arr1 instanceof Array&&arr2 instanceof Array)
      ;else{
      document.write("不相似");
       return false;
      };
      if(arr1.length==arr2.length);
      else { document.write("不相似");
       return false;
      };
      if(exist(arr1,Object)==exist(arr2,Object));
      else { document.write("不相似");
       return false;
      };
      if(exist(arr1,Number)==exist(arr2,Number));
      else { document.write("不相似");
       return false;
      };
      if(exist(arr1,String)==exist(arr2,String));
      else { document.write("不相似");
       return false;
      };
      if(exist(arr1,Boolean)==exist(arr2,Boolean));
      else { document.write("不相似");
       return false;
      };
      document.write("数组相似");
      return true;
      }
      function exist(arr,object){
      for(var i=0;i<arr.length;i++)
      {if(arr[i] instanceof object==true)
      return true;
      }return false;}

  • 猿星崛起
    2015-06-23 22:00:50

    这门课程是不是还没做完啊,还有后续章节?

  • 致良知
    2015-05-15 15:42:54

    我去这第二种还有小花太阳什么的。。略高深

  • 临阁
    2015-05-06 22:58:35

    好深奥!!

  • 最爱he了
    2015-05-04 16:00:34


    for (i = 0, n = TYPES.length; i < n; i++) {
            if (countMap1[TYPES[i]] !== countMap2[TYPES[i]]) {
                return false;
            }
        }

    这段判断成员类型?不是说顺序不同吗……这样判断不就是要按照顺序来吗。小白表示不理解

  • Sharon_zd
    2015-04-30 14:28:06

    第二段代码里面,return null === v ? "☀" : (v instanceof Date ? "❤" : (v === global ? "❀" : typeof v));

    怎么显示的太阳 心 和花?  只有我一个人浏览器这样么?还是说本来就是太阳,心 和花 ? = =


  • weibo_开着拖拉机在天上转悠_0
    2015-04-21 22:59:34

     function arraysSimilar(arr1, arr2){

            if(arr1.length!=arr2.length)

            {

               document.write("判定结果:不通过");

            }

            else 

            {

                foreach(a1 in arr1)

                {

                    foreach(b1 in arr2)

                    {

                      if(typeof a1!=typeof b1){return false;}

                   }

                }

                return true;

            }

            }

    这样写对不对啊?

  • 再不努力就是纯屌丝
    2015-04-06 23:17:46

    http://gaohaoyang.github.io/2015/04/06/arrays-similar/

    我写的这个代码如何?没有用任何JavaScript的函数,我自己想了好久才写出来的。

    老师看一下吧~

  • 流云行者
    2015-03-24 20:09:19

    第二种方法完全不知是啥,不过扎扎实实的先练好第一种吧

  • JeremyYin
    2015-03-04 15:36:36

    我去,你们这两种方法对初学者而言 有点天书了 在一个这种题目需要逻辑

  • 帅踢锅
    2015-02-15 15:05:51

    我也觉得先通过排序,然后获取类型,最后arrType1.toString()和arrType2.toString()一比较就可以了

  • LiVera
    2015-02-05 12:19:59

    for (; i < n; i++) {
            t1 = typeOf(arr1[i]);
            t2 = typeOf(arr2[i]);
            if (countMap1[t1]) {
                countMap1[t1]++;
            } else {
                countMap1[t1] = 1;
            }
            if (countMap2[t2]) {
                countMap2[t2]++;
            } else {
                countMap2[t2] = 1;
            }
        }

    这一段看不懂额,求解释。。。

  • LLeo小浩
    2015-01-13 10:44:03

    通过sort()排序将无序变有序,这样判断就容易多了

    赞。。。