imooc《JavaScript深入浅出》上的一个 arraysSimilar 函数
任务
请在 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(),可以准确地拿到原型链上对象的类名,但是函数可能会被重写,所以不优先使用。 - 但其实使用
instanceof是有问题的,考虑不同页面的构造函数可以不同——因此判断数组可以用Array.isArray()代替,参考
/*
* 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';
else
return (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);
}
下面是另一种实现:
function arraysSimilar(arr1, arr2) {
// 用 Object.prototype.toString ,但会被 hack
function getTypeName(item) {
return item === null ? 'Null' : Object.prototype.toString.call(item).slice(8, -1);
}
// 获取整个数组排序后的 typo
function getArrayTypo(arr) {
return arr.map(function (item) {
return getTypeName(item);
}).sort().join('');
}
// 使用 ECMAScript 5.1 的 isArray() 函数
if (!Array.isArray(arr1) || !Array.isArray(arr2))
return false;
// 长度不等的情况
if (arr1.length != arr2.length)
return false;
// 对于 typo 使用内置的字符串比较
return getArrayTypo(arr1) == getArrayTypo(arr2);
}
本文基于
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议发布,欢迎引用、转载或演绎,但是必须保留本文的署名BlackStorm以及本文链接http://www.cnblogs.com/BlackStorm/p/7182227.html,且未经许可不能用于商业目的。如有疑问或授权协商请与我联系。
imooc《JavaScript深入浅出》上的一个 arraysSimilar 函数的更多相关文章
- JavaScript深入浅出第2课:函数是一等公民是什么意思呢?
摘要: 听起来很炫酷的一等公民是啥? <JavaScript深入浅出>系列: JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼? JavaScript深入浅出第2课:函 ...
- javascript随机数发现的一个parseInt函数的问题
前几天想伪造一些数据,用到了随机数,没有自己写,便在网上找了一下,找到了这篇文章:https://www.cnblogs.com/starof/p/4988516.html .之后测试了一下,发现了一 ...
- 《你不知道的JavaScript(上)》笔记——函数作用域和块作用域
关于函数声明:如果 function 是声明中的第一个词, 那么就是一个函数声明, 否则就是一个函数表达式.例如匿名函数这种形式,函数会被当作函数表达式而不是一个标准的函数声明来处理. (functi ...
- JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼?
<JavaScript 深入浅出>系列: JavaScript 深入浅出第 1 课:箭头函数中的 this 究竟是什么鬼? JavaScript 深入浅出第 2 课:函数是一等公民是什么意 ...
- JavaScript深入浅出第5课:Chrome是如何成功的?
摘要: Chrome改变世界. <JavaScript深入浅出>系列: JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼? JavaScript深入浅出第2课:函数是一 ...
- JavaScript深入浅出第4课:V8引擎是如何工作的?
摘要: 性能彪悍的V8引擎. <JavaScript深入浅出>系列: JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼? JavaScript深入浅出第2课:函数是一等 ...
- JavaScript深入浅出第3课:什么是垃圾回收算法?
摘要: JS是如何回收内存的? <JavaScript深入浅出>系列: JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼? JavaScript深入浅出第2课:函数是一 ...
- 函数原型属性-JavaScript深入浅出(三)
前两次总结了JavaScript中的基本数据类型(值类型<引用类型>,引用类型<复杂值>)以及他们在内存中的存储,对内存空间有了一个简单的了解,以及第二次总结了this深入浅出 ...
- JavaScript移除绑定在元素上的匿名事件处理函数
前言: 面试的时候有点蒙,结束之后想想自己好像根本就误解了面试官的问题,因为我理解的这个问题本身就没有意义.但是当时已经有一些思路,但是在一个点上被卡住. 结束之后脑子瞬间灵光,想出了当时没有迈出的那 ...
随机推荐
- Filesystem Case-Sensitivity Mismatch
Filesystem Case-Sensitivity Mismatch The project seems to be located on a case-sensitive file system ...
- Linux - 创建定时任务
crontab命令 用来创建周期性定时任务 crontab {-l|-r|-e} -l 显示当前的 crontab -r 删除当前的 crontab -e 使用编辑器编辑当前 crontab 文件 输 ...
- CentOS7 linux 中提示 bash: ls: 未找到命令...
记录一次CentOS7里执行ls命令失败的问题 执行ls命令时报找不到命令,原因是环境变量PATH被修改, 解决办法: 执行 export PATH=/bin:/usr/bin:$PATH 然后 ...
- 剑指offer【02】- 替换空格(Java)
题目:替换空格 考点:字符串 题目描述: 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. ...
- Java并发编程笔记之SimpleDateFormat源码分析
SimpleDateFormat 是 Java 提供的一个格式化和解析日期的工具类,日常开发中应该经常会用到,但是由于它是线程不安全的,多线程公用一个 SimpleDateFormat 实例对日期进行 ...
- Java对日期Date类进行日期加减运算,年份加减,月份加减
package com.cy; import java.security.InvalidParameterException; import java.text.ParseException; imp ...
- Scrollanim – CSS3 & JavaScript 创建滚动动画
Scrollanim 是结合 CSS3 和 JavaScript 来创建令人惊叹的滚动动画的开源库. Scrolanim 支持在页面上的所有可用的元素的位置.有很多的自定义参数可以配置使用,构建出精彩 ...
- 前后端分离demo 旅馆管理系统
模型设计 旅馆管理系统,主要涉及到登记入住,退房以及客房和客人信息管理:经过分析抽像出涉及到的实体以及各实体之间的关系: 可以看出整个业务以客房为中心,入住,退房,定价,收费都是以客房为基本单 ...
- SpringBoot之使用Lettuce集成Redis
一.Lettuce Redis这里就不多说,服务端的启动之前的博客里面也有提到,这里略过.Lettuce和Jedis都是连接Redis Server的客户端程序,Jedis在实现上是直连redis s ...
- 【F12】chrome浏览器中 F12 功能的简单介绍
chrome浏览器中 F12 功能的简单介绍 由于F12是前端开发人员的利器,所以我自己也在不断摸索中,查看一些博客和资料后,自己总结了一下来帮助自己理解和记忆,也希望能帮到有需要的小伙伴,嘿嘿! 首 ...
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议