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移除绑定在元素上的匿名事件处理函数
前言: 面试的时候有点蒙,结束之后想想自己好像根本就误解了面试官的问题,因为我理解的这个问题本身就没有意义.但是当时已经有一些思路,但是在一个点上被卡住. 结束之后脑子瞬间灵光,想出了当时没有迈出的那 ...
随机推荐
- jsapi微信支付
JSAPI微信支付 引用js <script type="text/javascript" src="http://res.wx.qq.com/open/js/jw ...
- JavaScript实现页面显示倒计时功能
下面是用JS中的日期函数和定时器完成的一个倒计时的例子,效果如图: 代码如下: <!DOCTYPE html> <html> <head> <title> ...
- react写一个todo
概述 最近学习redux,打算先复习一下react,所以用react写了一个todo.记录下来,供以后开发时参考,相信对其他人也有用. 代码 代码请见我的github 组织架构如下图:
- Testing - 软件测试知识梳理 - 测试用例
测试用例 是指对一项特定的软件产品进行测试任务的描述,体现测试方案.方法.技术和策略. 内容包括测试目标.测试环境.输入数据.测试步骤.预期结果.测试脚本等,并形成文档. 每个具体测试用例都将包括下列 ...
- HoloLens开发手记-全息Hologram
HoloLens使我们可以通过周边世界的光线和声音来创建全息场景和物体,使得它们像真实物体那样.全息场景能够响应你的凝视.手势和语音指令,同时还会和你周边世界的表面交互.借助全息场景,你可以在周边世界 ...
- 橙色优学:2019年设计行业怎么样?UI设计行业前景分析
互联网的飞速发展带动了UI行业的火爆,成为时下最热门的高新技术行业.UI设计区别于传统的平面设计,更加注重界面.交互.体验等方面,这使UI设计变为了高薪的行业,对设计师的技能要求也就变得更加严格. 自 ...
- C# 判断字符串是否符合十六进制,八进制,二进制和十进制整数格式的正则表达式
/// <summary> /// 判断是否十六进制格式字符串 /// </summary> /// <param name="str">< ...
- python异步编程--回调模型(selectors模块)
目录 0. 参考地址 1. 前言 2. 核心类 3. SelectSelector核心函数代码分析 3.1 注册 3.2 注销 3.3 查询 4. 别名 5. 总结 6. 代码报错问题 1. 文件描述 ...
- abstract、virtual、sealed、 interface、struct 基础知识整理
abstract abstract 修饰符指示被修改内容的实现已丢失或不完整. abstract 修饰符可用于类.方法.属性.索引和事件. 在类声明中使用 abstract修饰符以指示某个类仅旨在作为 ...
- 【Eclipse】添加builder实现NDK的自动编译
最近在做NDK相关的东西,Eclipse里面java的自动编译很方便,每次改动后就能自己编译显示错误,而NDK的C/C++文件就需要保存后再手动点build. 研究了下发现java code的自动编译 ...
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议