任务

请在 index.html 文件中,编写 arraysSimilar 函数,实现判断传入的两个数组是否相似。具体需求:

  1. 数组中的成员类型相同,顺序可以不同。例如 [1, true] 与 [false, 2] 是相似的。
  2. 数组的长度一致。
  3. 类型的判断范围,需要区分: String , Boolean, Number, undefined, null, 函数, 日期, window.

    当以上全部满足,则返回"判定结果:通过",否则返回"判定结果:不通过"。

这是一个奇怪的需求,主要是要求“相似”的判断。

  • 第一直觉是直接对数组排序,然后比较类型。但由于 JS 比较大小的特性,这是不对的。
  • 那么需要变换一下,我这里是取每个元素的类型名简写,这样可以近似 \(O(NlogN)\) 排字典序,再将其作为整个数组的 typo ,就可以近似 \(O(N)\) 比较数组是否相似。
  • 第二个要注意的点是对无效参数的判断,一开始是用 == null 来判断 nullundefined 的,但是要求参数类型为数组,所以用 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 函数的更多相关文章

  1. JavaScript深入浅出第2课:函数是一等公民是什么意思呢?

    摘要: 听起来很炫酷的一等公民是啥? <JavaScript深入浅出>系列: JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼? JavaScript深入浅出第2课:函 ...

  2. javascript随机数发现的一个parseInt函数的问题

    前几天想伪造一些数据,用到了随机数,没有自己写,便在网上找了一下,找到了这篇文章:https://www.cnblogs.com/starof/p/4988516.html .之后测试了一下,发现了一 ...

  3. 《你不知道的JavaScript(上)》笔记——函数作用域和块作用域

    关于函数声明:如果 function 是声明中的第一个词, 那么就是一个函数声明, 否则就是一个函数表达式.例如匿名函数这种形式,函数会被当作函数表达式而不是一个标准的函数声明来处理. (functi ...

  4. JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼?

    <JavaScript 深入浅出>系列: JavaScript 深入浅出第 1 课:箭头函数中的 this 究竟是什么鬼? JavaScript 深入浅出第 2 课:函数是一等公民是什么意 ...

  5. JavaScript深入浅出第5课:Chrome是如何成功的?

    摘要: Chrome改变世界. <JavaScript深入浅出>系列: JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼? JavaScript深入浅出第2课:函数是一 ...

  6. JavaScript深入浅出第4课:V8引擎是如何工作的?

    摘要: 性能彪悍的V8引擎. <JavaScript深入浅出>系列: JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼? JavaScript深入浅出第2课:函数是一等 ...

  7. JavaScript深入浅出第3课:什么是垃圾回收算法?

    摘要: JS是如何回收内存的? <JavaScript深入浅出>系列: JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼? JavaScript深入浅出第2课:函数是一 ...

  8. 函数原型属性-JavaScript深入浅出(三)

    前两次总结了JavaScript中的基本数据类型(值类型<引用类型>,引用类型<复杂值>)以及他们在内存中的存储,对内存空间有了一个简单的了解,以及第二次总结了this深入浅出 ...

  9. JavaScript移除绑定在元素上的匿名事件处理函数

    前言: 面试的时候有点蒙,结束之后想想自己好像根本就误解了面试官的问题,因为我理解的这个问题本身就没有意义.但是当时已经有一些思路,但是在一个点上被卡住. 结束之后脑子瞬间灵光,想出了当时没有迈出的那 ...

随机推荐

  1. B树之C语言实现(包含查找、删除、插入)

    B树的定义 一棵m阶B树(Balanced Tree of order m),或为空树,或为满足下列特性对的m叉树. 树中每个结点最多含有m棵子树. 若根结点不是叶子结点,则至少有2个子树. 除根结点 ...

  2. Spring集合注入

    1.集合注入 上一篇博客讲了spring得属性注入,通过value属性来配置基本数据类型,通过<property>标签的 ref 属性来配置对象的引用.如果想注入多个数据,那我们就要用到集 ...

  3. shell if 条件判断

    condition='123' if [ -z condition]; then echo "condition 是空的" fi 字符串判断: = 两个字符串相等. != 两个字符 ...

  4. 多核CPU配合负载均衡可以这样用,为老板省点钱

    负载均衡作为一个处理高并发,大流量的访问的业务场景,已经几乎是常识性的知识了. 而本文的意义在于需求:由于大流量请求,导致服务无法正常响应,在不增加购买机器成本的场景下,如何提高服务器的业务处理能力? ...

  5. docker的安装与启动

    安装docker Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的.在很多版本的CentOS中是不支 ...

  6. Mongodb 无法启动 windows Mongodb 无法启动 couldn't connect to server

      发现在mongodb.log里出现  2017-07-07T17:01:55.339+0800 I CONTROL  [main] Error connecting to the Service ...

  7. 14-02 Java Math类,Random类,System类,BigDecimal类

    Math类 Math的方法 package cn.itcast_01; /* * Math:用于数学运算的类. * 成员变量: * public static final double PI * pu ...

  8. 使用SonarCloud对.NET Core项目进行静态代码分析

    本文将介绍如何使用SonarCloud进行.NET Core项目的静态代码分析.SonarCloud是SonarQube提供的基于云的版本,特别针对于开源项目是免费的. 首先,在sonarcloud. ...

  9. mysql 开发进阶篇系列 33 工具篇(mysqlbinlog日志管理工具)

    一.概述 由于服务器生成的二进制日志文件以二进制格式保存,所以如果要想检查这些文件的文本格式,就会用到mysqlbinlog日志管理工具. mysqlbinlog的语法如下: mysqlbinlog ...

  10. [深度学习]理解RNN, GRU, LSTM 网络

    Recurrent Neural Networks(RNN) 人类并不是每时每刻都从一片空白的大脑开始他们的思考.在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义 ...