imooc《JavaScript深入浅出》上的一个arraysSimilar函数
程序员文章站
2022-04-01 12:58:36
...
任务
请在index.html文件中,编写arraysSimilar函数,实现判断传入的两个数组是否相似。具体需求:
数组中的成员类型相同,顺序可以不同。例如[1, true] 与 [false, 2]是相似的。
数组的长度一致。
类型的判断范围,需要区分:String, Boolean, Number, undefined, null, 函数,日期, window.
当以上全部满足,则返回"判定结果:通过",否则返回"判定结果:不通过"。
这是一个奇怪的需求,主要是要求“相似”的判断。
第一直觉是直接对数组排序,然后比较类型。但由于JS比较大小的特性,这是不对的。
那么需要变换一下,我这里是取每个元素的类型名简写,这样可以近似\(O(NlogN)\)排字典序,再将其作为整个数组的typo,就可以近似\(O(N)\)比较数组是否相似。
第二个要注意的点是对无效参数的判断,一开始是用== null
来判断null
和undefined
的,但是要求参数类型为数组,所以用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函数的详细内容,更多请关注其它相关文章!