题目

题目来自 慕课网 JavaScript 深入浅出 1-6 编程练习

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

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

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

题目给出了 index.html 如下:

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb18030">
<title>Untitled Document</title> </head>
<body>
<script type="text/javascript">
/*
* param1 Array
* param2 Array
* return true or false
*/
function arraysSimilar(arr1, arr2){ }
</script>
<script src="testData.js"></script>
</body>
</html>

其中 testData.js 是测试用例,代码如下

var result = function() {
//以下为多组测试数据
var cases = [{
arr1: [1, true, null],
arr2: [null, false, 100],
expect: true
}, {
arr1: [
function() {},
100
],
arr2: [100, {}],
expect: false
}, {
arr1: [null, 999],
arr2: [{},
444
],
expect: false
}, {
arr1: [window, 1, true, new Date(), "hahaha", (function() {}), undefined],
arr2: [undefined, (function() {}), "okokok", new Date(), false, 2, window],
expect: true
}, {
arr1: [new Date()],
arr2: [{}],
expect: false
}, {
arr1: [window],
arr2: [{}],
expect: false
}, {
arr1: [undefined, 1],
arr2: [null, 2],
expect: false
}, {
arr1: [new Object, new Object, new Object],
arr2: [{}, {},
null
],
expect: false
}, {
arr1: null,
arr2: null,
expect: false
}, {
arr1: [],
arr2: undefined,
expect: false
}, {
arr1: "abc",
arr2: "cba",
expect: false
}]; //使用for循环, 通过arraysSimilar函数验证以上数据是否相似,如相似显示“通过”,否则"不通过",所以大家要完成arraysSimilar函数,具体要求,详见任务要求。
for (var i = 0; i < cases.length; i++) {
if (arraysSimilar(cases[i].arr1, cases[i].arr2) !== cases[i].expect) {
document.write("不通过!case" + (i + 1) + "不正确!arr1=" + JSON.stringify(cases[i].arr1) + ", arr2=" + JSON.stringify(cases[i].arr2) + " 的判断结果不是" + cases[i].expect);
return false;
}
}
return true; }();
document.write("判定结果:" + (result ? "通过" : "不通过"));

解答

各位读者在看解答前也可以自己考虑一下,看看咱们的想法是否一致,期待您在本文的留言。


思路

通过观察测试用例,可以发现,最后三个用例有不是数组的。所以我们可以先判断传入的参数是否是数组。
又因为题目中要求数组长度必须一致,这也是第二个限制条件。
最后再区分具体的类型。

理清思路我们可以分为以下步骤:

  1. 判断传入的参数是否为数组 (使用 instanceof 方法)
  2. 检查两个数组长度是否一致
  3. 分别判断数组内元素的基本数据类型 (使用 typeof 方法)
  4. 因为 typeof 只能检查基本数据类型,对于 null, Date, window 返回的都是 object,所以使用 Object.prototype.toString.apply() 来检查这些对象类型,其返回值为:'[object Null]', '[object Date]', '[object global]'
  5. 分别比较每个数组内元素的各种类型的个数,如果都相等,那么这两个数组是相似的。

具体实现代码

JavaScript代码如下

/**
* =====================================================
* 请在index.html文件中,编写arraysSimilar函数,实现判断传入的两个数组是否相似。具体需求:
* 1. 数组中的成员类型相同,顺序可以不同。例如[1, true] 与 [false, 2]是相似的。
* 2. 数组的长度一致。
* 3. 类型的判断范围,需要区分:String, Boolean, Number, undefined, null, 函数,日期, window.
*
* 当以上全部满足,则返回"判定结果:通过",否则返回"判定结果:不通过"。
* =====================================================
*/ /*
* param1 Array
* param2 Array
* return true or false
*/
function arraysSimilar(arr1, arr2){
if (arr1 instanceof Array && arr2 instanceof Array ) { //先判断传入的是否是数组
if (arr1.length == arr2.length) { //判断数组长度
console.log("same-length");
console.log(arr1);
console.log(arr2);
//开始判断数组内部是否相似
return sameLengthArraysSimilar(arr1, arr2);
} else{
//两个数组长度不同返回false
return false;
}
} else {
//传入的参数不是数组返回false
return false;
}
} /**
* 判断两个等长的数组内部是否相似
* 遍历数组
* arr1中元素各种类型出现的个数是否和arr2中元素各种类型出现的个数相同
* @param {Array} arr1 数组1
* @param {Array} arr2 数组2
* @return {true,false}
*/
function sameLengthArraysSimilar(arr1,arr2) {
var numInArr1 = 0;
var numInArr2大专栏  判断两个数组是否相似 (arraysSimilar)an> = 0;
var booleanInArr1 = 0;
var booleanInArr2 = 0;
var funInArr1 = 0;
var funInArr2 = 0;
var undefinedInArr1 = 0;
var undefinedInArr2 = 0;
var stringInArr1 = 0;
var stringInArr2 = 0;
var nullInArr1 = 0;
var nullInArr2 = 0;
var dateInArr1 = 0;
var dateInArr2 = 0;
var windowInArr1 = 0;
var windowInArr2 = 0; for (var i = 0; i < arr1.length; i++) {
if(typeof arr1[i] === 'number' ){
numInArr1 ++;
} else if(typeof arr1[i] === 'boolean'){
booleanInArr1 ++;
} else if(typeof arr1[i] === 'function'){
funInArr1 ++;
} else if(typeof arr1[i] === 'undefined'){
undefinedInArr1 ++;
} else if(typeof arr1[i] === 'string'){
stringInArr1 ++;
} else if(typeof arr1[i] ==='object'){
if(Object.prototype.toString.apply(arr1[i]) === '[object Null]'){
nullInArr1 ++;
} else if(Object.prototype.toString.apply(arr1[i]) === '[object Date]'){
dateInArr1 ++;
} else if(Object.prototype.toString.apply(arr1[i]) === '[object global]'){
windowInArr1 ++;
}
} if(typeof arr2[i] === 'number'){
numInArr2 ++;
} else if(typeof arr2[i] === 'boolean'){
booleanInArr2 ++;
} else if(typeof arr2[i] === 'function'){
funInArr2 ++;
} else if(typeof arr2[i] === 'undefined'){
undefinedInArr2 ++;
} else if(typeof arr2[i] === 'string'){
stringInArr2 ++;
} else if(typeof arr2[i] ==='object'){
if(Object.prototype.toString.apply(arr2[i]) === '[object Null]'){
nullInArr2 ++;
} else if(Object.prototype.toString.apply(arr2[i]) === '[object Date]'){
dateInArr2 ++;
} else if(Object.prototype.toString.apply(arr2[i]) === '[object global]'){
windowInArr2 ++;
}
}
} console.log("num---"+numInArr1);
console.log("num---"+numInArr2);
console.log("boo---"+booleanInArr1);
console.log("boo---"+booleanInArr2);
console.log("null---"+nullInArr1);
console.log("null---"+nullInArr2);
console.log("window---"+windowInArr1);
console.log("window---"+windowInArr2);
console.log("date---"+dateInArr1);
console.log("date---"+dateInArr2);
console.log("string---"+stringInArr1);
console.log("string---"+stringInArr2);
console.log("fun---"+funInArr1);
console.log("fun---"+funInArr2);
console.log("undefined---"+undefinedInArr1);
console.log("undefined---"+undefinedInArr2); if(numInArr1 == numInArr2 && booleanInArr1==booleanInArr2 && funInArr1==funInArr2 && undefinedInArr1==undefinedInArr2 && stringInArr1==stringInArr2 && nullInArr1==nullInArr2 && dateInArr1==dateInArr2 && windowInArr1==windowInArr2){
console.log('================================true');
return true;
}else{
console.log('================================false');
return false;
}
}

总结

  • 上述代码完美的跑完所有的测试用例,读者 点击这里查看结果,并且可以按 f12 看 Console 信息, 里面有代码的执行过程。
  • 当然你也可以复制本文的 JavaScript 代码,在 慕课网的习题 下跑一下,也可以看到 判定结果:通过 的结果
  • 完整源代码在我的 GitHub javascript-test/arraysSimilar/ 仓库中
  • 其实我的代码逻辑并不复杂,有点空间换时间的感觉,执行效率应该是较高的。没有用 JavaScript 封装的任何函数,完全是自己写的。其实代码除去 console.log() 也并没有多少行。
  • 各位读者有什么好的想法欢迎留言交流!

判断两个数组是否相似 (arraysSimilar)的更多相关文章

  1. js中的传值和传引用,判断两个数组是否相等

    所谓js的中的传值,其实也就是说5种基本数据类型(null,undefind,boolean,number,string) 传引用也就是说的那个引用数据类型,(array和objec) 基本数据类型的 ...

  2. php判断两个数组是否相等

    php判断两个数组是否相等 一.总结 一句话总结: php判断两个数组是否相等可以直接上==或者===号 二.php 判断两个数组是否相等 转自或参考:php 判断两个数组是否相等https://ww ...

  3. JS判断两个数组的元素是否完全相等

    1.使用ES6 新增的扩展运算符和Set新数据类型判断两个数组是否包含有相同的元素 var arr1 = ['green' , 'yellow' ,'blue' ,'red']; var arr2 = ...

  4. 利用哈希map快速判断两个数组的交集

    在大多数情况,也就是一般的情况下,大家都能想出最暴力的解法,通常也就是采用遍历或者枚举的办法来解决问题. 该题需要找出两个数组的交集,最简单的一个办法就是用A数组里面的所有数去匹配B数组里面的数.假设 ...

  5. JS深度判断两个数组对象字段相同

    /** * 判断此对象是否是Object类型 * @param {Object} obj */ function isObject(obj){ return Object.prototype.toSt ...

  6. C#如何判断两个数组相等

    /// <summary> /// 数组比较是否相等 /// </summary> /// <param name="bt1">数组1</ ...

  7. Javascript 判断传入的两个数组是否相似

    任务描述: 请在index.html文件中,编写arraysSimilar函数,实现判断传入的两个数组是否相似.具体需求: 1. 数组中的成员类型相同,顺序可以不同.例如[1, true] 与 [fa ...

  8. NX二次开发-算法篇-判断找到两个数组里不相同的对象

    NX9+VS2012 #include <uf.h> #include <uf_curve.h> #include <uf_modl.h> #include < ...

  9. javascript 简单实现对两个数组相似度的检验

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. Java if、switch语句,break,case,类型转换、常量、赋值比较、标识符(2)

    if语句: /* if else 结构 简写格式: 变量 = (条件表达式)?表达式1:表达式2: 三元运算符: 好处:可以简化if else代码. 弊端:因为是一个运算符,所以运算完必须要有一个结果 ...

  2. eclipse环境配置,字体大小,代码智能提示,JSP页面默认字符集修改

    安装好JDK后,下载Java EE解压版eclipse 1.字体大小 Windows——>Preferences——>General——>Appearance——>Colors ...

  3. Paper Review: Epigenetic Landscape, Cell Differentiation 01

    Today, I'll share a review papers about Epigenetic Landscape, the Epigenetic Landscape is related to ...

  4. mysql my.ini 性能调优

    MYSQL服务器my.cnf配置文档详解 硬件:内存16G [client] port = 3306 socket = /data/3306/mysql.sock [mysql] no-auto-re ...

  5. 计蒜客 一维坐标的移动(BFS)

    在一个长度为 n 的坐标轴上,蒜头君想从 A 点 移动到 B 点.他的移动规则如下: 向前一步,坐标增加 1. 向后一步,坐标减少 1. 跳跃一步,使得坐标乘 2. 蒜头君不能移动到坐标小于 0 或大 ...

  6. 用一行Python进行数据收集探索

    简易的Pandas之路 任何使用Python数据的人都会熟悉Pandas包.Pandas是大多数行和列格式数据的go-to包.如果你没有Pandas,请确保在终端中使用pip install安装: p ...

  7. 01 语言基础+高级:1-8 File类与IO流_day09【字节流、字符流】

    day09[字节流.字符流] 主要内容 IO流 字节流 字符流 异常处理 Properties 教学目标 能够说出IO流的分类和功能 能够使用字节输出流写出数据到文件 能够使用字节输入流读取数据到程序 ...

  8. java中常见的json解析方法、库以及性能对比

    常见的json解析有原生的JSONObject和JSONArray方法,谷歌的GSON库,阿里的fastjson,还有jackson,json-lib. Gson(项目地址:https://githu ...

  9. OpenCV学习与应用

    1.VS2019配置OpenCVhttps://blog.csdn.net/weixin_42274148/article/details/85321091 2.Python中使用PIL快速实现灰度图 ...

  10. 阿里云ECS搭建邮件服务

    安装mailx [root@db ~]# yum install -y mailx [root@db ~]# vim /etc/mail.rc 设置发件人信息 ..... set from=yunwe ...