为了账号安全,请及时绑定邮箱和手机立即绑定

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

该编程题目主要考察对数据类型判断的处理。题目要求正确区分基本类型,同时对象类型也有多种区分,所以使用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());
}


正在回答

15 回答

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

0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~
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;
        }
    }

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

0 回复 有任何疑惑可以回复我~
#1

Bosn 提问者

用一个对象, key是类型,value是出现次数。然后遍历两个map,如果每一种类型,值(出现次数)都一样,这样就得出两个数组同构。
2015-02-13 回复 有任何疑惑可以回复我~

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

赞。。。

0 回复 有任何疑惑可以回复我~
#1

Bosn 提问者

嗯,再用字符来表示类型,这样大大缩减了代码长度。最后就变为了简单得字符串比较。
2015-01-13 回复 有任何疑惑可以回复我~
#2

cloudwin

表示小菜鸟看不懂第二种写法
2015-02-06 回复 有任何疑惑可以回复我~
#3

qq_天长_0 回复 Bosn 提问者

表示小菜鸟看不懂第二种写法
2015-05-13 回复 有任何疑惑可以回复我~
#4

伤心雨后 回复 qq_天长_0

表示菜鸟
2015-07-03 回复 有任何疑惑可以回复我~
#5

追风侠客 回复 Bosn 提问者

6456
2016-01-07 回复 有任何疑惑可以回复我~
#6

追风侠客 回复 qq_天长_0

赞个啊
2016-01-07 回复 有任何疑惑可以回复我~
#7

追风侠客

挺好的
2016-01-07 回复 有任何疑惑可以回复我~
查看4条回复
首页上一页12下一页尾页

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信