判断两个数组是否相似 (arraysSimilar)
题目
题目来自 慕课网 JavaScript 深入浅出 1-6 编程练习
请在 index.html 文件中,编写 arraysSimilar 函数,实现判断传入的两个数组是否相似。具体需求:
- 数组中的成员类型相同,顺序可以不同。例如 [1, true] 与 [false, 2] 是相似的。
- 数组的长度一致。
- 类型的判断范围,需要区分: 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 ? "通过" : "不通过"));
解答
各位读者在看解答前也可以自己考虑一下,看看咱们的想法是否一致,期待您在本文的留言。
思路
通过观察测试用例,可以发现,最后三个用例有不是数组的。所以我们可以先判断传入的参数是否是数组。
又因为题目中要求数组长度必须一致,这也是第二个限制条件。
最后再区分具体的类型。
理清思路我们可以分为以下步骤:
- 判断传入的参数是否为数组 (使用
instanceof方法) - 检查两个数组长度是否一致
- 分别判断数组内元素的基本数据类型 (使用
typeof方法) - 因为
typeof只能检查基本数据类型,对于null,Date,window返回的都是object,所以使用Object.prototype.toString.apply()来检查这些对象类型,其返回值为:'[object Null]','[object Date]','[object global]' - 分别比较每个数组内元素的各种类型的个数,如果都相等,那么这两个数组是相似的。
具体实现代码
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)的更多相关文章
- js中的传值和传引用,判断两个数组是否相等
所谓js的中的传值,其实也就是说5种基本数据类型(null,undefind,boolean,number,string) 传引用也就是说的那个引用数据类型,(array和objec) 基本数据类型的 ...
- php判断两个数组是否相等
php判断两个数组是否相等 一.总结 一句话总结: php判断两个数组是否相等可以直接上==或者===号 二.php 判断两个数组是否相等 转自或参考:php 判断两个数组是否相等https://ww ...
- JS判断两个数组的元素是否完全相等
1.使用ES6 新增的扩展运算符和Set新数据类型判断两个数组是否包含有相同的元素 var arr1 = ['green' , 'yellow' ,'blue' ,'red']; var arr2 = ...
- 利用哈希map快速判断两个数组的交集
在大多数情况,也就是一般的情况下,大家都能想出最暴力的解法,通常也就是采用遍历或者枚举的办法来解决问题. 该题需要找出两个数组的交集,最简单的一个办法就是用A数组里面的所有数去匹配B数组里面的数.假设 ...
- JS深度判断两个数组对象字段相同
/** * 判断此对象是否是Object类型 * @param {Object} obj */ function isObject(obj){ return Object.prototype.toSt ...
- C#如何判断两个数组相等
/// <summary> /// 数组比较是否相等 /// </summary> /// <param name="bt1">数组1</ ...
- Javascript 判断传入的两个数组是否相似
任务描述: 请在index.html文件中,编写arraysSimilar函数,实现判断传入的两个数组是否相似.具体需求: 1. 数组中的成员类型相同,顺序可以不同.例如[1, true] 与 [fa ...
- NX二次开发-算法篇-判断找到两个数组里不相同的对象
NX9+VS2012 #include <uf.h> #include <uf_curve.h> #include <uf_modl.h> #include < ...
- javascript 简单实现对两个数组相似度的检验
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
随机推荐
- Java之同步代码块处理继承Thread类的线程安全问题
package com.atguigu.java; /** *//** * 使用同步代码块解决继承Thread类的方式的线程安全问题 * * 例子:创建三个窗口卖票,总票数为100张.使用继承Thre ...
- Java之多线程窗口卖票问题(Thread)
/** * * 例子:创建三个窗口卖票,总票数为100张.使用继承Thread类的方式 * * 存在线程的安全问题,待解决. * */class Window extends Thread{ priv ...
- NOIP复赛文件路径怎么写
以2018年NOIP普及组复赛为例,四道题对应着四个文件夹: 随便选一道题,比如第一道题,进入title目录,可以看到title1.in, title1.ans, title2.in, title ...
- iOS 加急审核的办法
前言:由于自己的APP在提交后,审核了大概一周左右还没有消息,而领导又不断询问情况,于是自己在网上看到了这篇文章.由于自己比较懒,所以在此记录下来,以供 大家参考. 说明:本文只是做一个记录,还望看到 ...
- 4. 监控利器nagios手把手企业级实战第三部
1.nagios图形监控显示和管理服务器 虽然能显示,能报警.但是我们企业工作中需要一个历史趋势图. nagios只开放核心,插件是单独的形式,图像也一样,是插件或者整合的方式.所以可能看起来很多,这 ...
- 九、Shell脚本高级编程实战第九部
一.监控mysql主从同步是否异常,如果异常,发送短信给管理员 1)开发一个守护进程脚本每30秒实现检测一次. 2)如果错误号是:1158.1159.1008.1007.1062,请跳过 3)请使用数 ...
- StartDT AI Lab | 需求预测引擎如何助力线下零售业降本增效?
在当下经济明显进入存量博弈的阶段,大到各经济体,小到企业,粗放的增长模式已不适宜持续,以往高增长的时代已经成为过去,亟需通过变革发掘新的增长点.对于竞争激烈的线下零售行业而言,则更需如此. 零售行业一 ...
- 01 语言基础+高级:1-7 异常与多线程_day07 【线程池、Lambda表达式】
day07[线程池.Lambda表达式] 主要内容 等待与唤醒案例 线程池 Lambda表达式 教学目标 -[ ] 能够理解线程通信概念-[ ] 能够理解等待唤醒机制-[ ] 能够描述Java中线程池 ...
- springMVC常用知识点的整理
[spring boot]第3篇:spring boot 进行 web 开发 forward和redirect的区别是什么 Spring MVC中redirect重定向3种方式 =========== ...
- Adobe Photoshop、Adobe Illustrator、Bohemian的Sketch、Figma比较
整体来说: Adobe Photoshop:位图图像编辑处理,更适合图片编辑和数码绘画处理: Adobe Illustrator:矢量设计,更适合图标设计和图形设计处理: Sketch:矢量设计,更适 ...