任务 请在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函数的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号