PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

imooc《JavaScript深入浅出》上的一个arraysSimilar函数

PHP中文网
PHP中文网 原创
2018-05-19 16:38:32 864浏览

任务 请在index.html文件中,编写arraysSimilar函数,实现判断传入的两个数组是否相似。具体需求: 数组中的成员类型相同,顺序可以不同。例如[1, true] 与 [false, 2]是相似的。 数组的长度一致。 类型的判断范围,需要区分:String, Boolean, Number, undefined, null, 函数,日期, window. 当以上全部满足,则返回"判定结果:通过",否则返回"判定结果:不通过"。

这是一个奇怪的需求,主要是要求“相似”的判断。
第一直觉是直接对数组排序,然后比较类型。但由于JS比较大小的特性,这是不对的。
那么需要变换一下,我这里是取每个元素的类型名简写,这样可以近似\(O(NlogN)\)排字典序,再将其作为整个数组的typo,就可以近似\(O(N)\)比较数组是否相似。
第二个要注意的点是对无效参数的判断,一开始是用== null来判断nullundefined的,但是要求参数类型为数组,所以用instanceof判断。
获取类型的替代方案是用Object.prototype.toString(),可以准确地拿到原型链上对象的类名,但是函数可能会被重写,所以不优先使用。

        /*          
        * param1 Array          
        * param2 Array         
        * return true or false         
        */function arraysSimilar(arr1, arr2) {
        // 获取单个元素的类型名简写,已经满足需求
        // 替代方案:考虑用Object.prototype.toString,但会被hack
        function getTypeNameS(item) {
        if (item === null)return 'nl';
        else if (item instanceof Date)
        return 'd';
        else if (item instanceof Window)
        return 'w';
        elsereturn (typeof item)[0];
        }
        // 获取整个数组排序后的typo
        function getArrayTypo(arr) {
        return arr.map(function (item) {
        return getTypeNameS(item);
        }).sort().join('');
        }
        // 可以判断==null,但由于要求类型为数组,那就用instanceof
        if (!(arr1 instanceof Array) || !(arr2 instanceof Array))
        return false;
        // 长度不等的情况,可以合并到typo比较中
        if (arr1.length != arr2.length)return false;
        // 对于typo使用内置的字符串比较
        return getArrayTypo(arr1) == getArrayTypo(arr2);
        }

本文基于知识共享许可协议知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议发布,欢迎引用、转载或演绎,但是必须保留本文的署名BlackStorm以及本文链接,且未经许可不能用于商业目的。如有疑问或授权协商请与我联系。

以上就是imooc《JavaScript深入浅出》上的一个arraysSimilar函数的详细内容,更多请关注php中文网其它相关文章!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。