任务描述:

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


  1. 数组中的成员类型相同,顺序可以不同。例如[1, true] 与 [false, 2]是相似的。


  2. 数组的长度一致。


  3. 类型的判断范围,需要区分:String, Boolean, Number, undefined, null, 函数,日期, window.

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

思路:1.判断两个数组的长度是否相同。否则,返回false

   2.定义两个新数组,用来储存 arr1 和 arr2 的各种成员类型

     (用到 push()方法和 call()方法,后者在本处的用处是,用Object.prototype.toString方法获得的对象 代替 arr1[i],即最后push到arrType1中的是arr1[i]的成员类型,如Array、num、function等等,而不是原本具体的数据之类的。)

   3.排序后,用“==”进行比较。

方法一:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>判断类型</title>
<script>
/*
* param1 Array
* param2 Array
* return true or false
*/
function arraysSimilar(arr1, arr2){
var arrType1=[];
var arrType2=[];
// 判断是否是数组
if(!(arr1 instanceof Array&&arr2 instanceof Array)){
return false;
}
// 长度是否相同
if(arr1.length!=arr2.length){
return false;
}
// 判断类型是否相同
for( var i=0; i<arr1.length; i++){
arrType1.push(Object.prototype.toString.call(arr1[i]));//x.call(y)即用x对象代替y对象
arrType2.push(Object.prototype.toString.call(arr2[i]));
}
if(arrType1.sort().toString()== arrType2.sort().toString()){//sort方法:如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。
return "通过";
}else{
return "不通过";
}
}
</script>
</head>
<body> </body>
</html> 测试样例:
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?"通过":"不通过"));

但是存在一个问题:最后,用if(arrType1.sort().toString()== arrType2.sort().toString())进行判断,但是toString()方法适合内置类型和基本元素。遇到 null 和 undefined 失效。(在IE6/7/8都会返回object)

          内置对象:Date,Array,String,Math 四种。

          基本类型:number,string, boolean,null,undefined,object

方法二:

        function arraysSimilar(arr1, arr2){
if(arr1 instanceof Array && arr2 instanceof Array){
var key1 = [],key2 = [],len = arr1.length,len2=arr2.length;
// 数组的长度相等判断
if(len!=len2){return false;}
// 类型相同判断
if(len){
// 获取类型列表
for(var i= 0;i<len;i++){
// 数组1的类型列表字串
var item1 = arr1[i], typeFirst = typeOf(item1);
if(key1.join().indexOf(typeFirst)<0){// join()方法用于把数组中的所有元素放入一个字符串。 if(该类型一次都没出现)
key1.push(typeFirst);// indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置,返回的是位置对应的序号
} // 数组2的类型列表字串
var item2 = arr2[i],typeSecond = typeOf(item2);
if(key2.join().indexOf(typeSecond)<0){
key2.push(typeSecond);
}
}
key1 = key1.sort();
key2 = key2.sort();
// 类型字串比较
if(key1.join() == key2.join()){
return true;
}else{
return false;
}
}else{
// 空数组相等
return true;
}
}else{
// 非数组
return false;
} }      function typeOf(item){
            var type = typeof item;
            if(type != "object"){
                // 判断基本类型string,function,boolean,number,undefine
            }else if(item === null){
                // check null
                type = "null";
            }else if(item === window){
                // check window
                type ="window";
            }else{
                // 判断object类型object,date,array
                if(item instanceof Date){
                    type = "date";
                }else if(item instanceof Array){
                    type = 'array';
                }else{
                    type = 'object';
                }
            }
            return type;
        }

Javascript 判断传入的两个数组是否相似的更多相关文章

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

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

  2. JavaScript判断该对象是否为数组

    typeof 用来检测数据类型,Function, String, Number, Undefined都可以使用typeof来判断. function test(){} console.log(typ ...

  3. JavaScript判断变量名是否存在数组中

    直接上代码: JavaScript代码: var array=[{name:"张珊",sex:"男"}]; console.log(array); if(arr ...

  4. [转][javascript]判断传入参数

    // IE 下 name 都是 undefined ,这里手动赋值 Number.name="Number"; //String.name="String"; ...

  5. 判断两个数组是否相似 (arraysSimilar)

    题目 解答 思路 具体实现代码 总结 题目 题目来自 慕课网 JavaScript 深入浅出 1-6 编程练习 请在 index.html 文件中,编写 arraysSimilar 函数,实现判断传入 ...

  6. javascript合并两个数组

    在开发的过程中,我们很多时候会遇到需要将两个数组合并成一个数组的情况出现. var arr1 = [1, 2, 3]; var arr2 = [4, 5, 6]; // 将arr1和arr2合并成为[ ...

  7. 用JavaScript比较两个数组是否相等

    JS怎么比较两个数组是否有完全相同的元素?Javascript不能直接用==或者===来判断两个数组是否相等,无论是相等还是全等都不行,以下两行JS代码都会返回false alert([0,0,0]= ...

  8. Javascript 连接两个数组

    JS合并两个数组的方法 我们在项目过程中,有时候会遇到需要将两个数组合并成为一个的情况.比如: var a = [1,2,3]; var b = [4,5,6]; 有两个数组a.b,需求是将两个数组合 ...

  9. JavaScript如何比较两个数组的内容是否相同

    今天意外地发现JavaScript是不能用==或===操作符直接比较两个数组是否相等的. alert([]==[]); // false alert([]===[]); // false 以上两句代码 ...

随机推荐

  1. 在VMWare上安装Arch Linux

    1.为什么选择Arch Linux Arch Linux 是通用 x86-64 GNU/Linux 发行版.Arch采用滚动升级模式,尽全力提供最新的稳定版软件.初始安装的Arch只是一个基本系统,随 ...

  2. OSI七层模型对应的协议

    osi七层模型对应的协议 author:headsen chen    2017-10-21  11:44:47 个人原创,转载请注明作者,出处.否则依法追究法律责任 1,物理层:带信号的,同轴电缆, ...

  3. 二叉树遍历等基本操作(Java实现)

    前中后序遍历递归实现+层序遍历: 树的结点类代码: public class TreeNode<Value extends Comparable<? super Value>> ...

  4. [模拟赛] T3 最优序列

    Description 给出一个长度为n(n<=1000)的正整数序列,求一个子序列,使得原序列中任意长度为m的子串中被选出的元素不超过k(k<=m<=10)个,并且选出的元素之和最 ...

  5. JS时间处理由CST格式转成GMT格式时间

    问题描述:js接收java后台的时间数据时,时间格式的CST时间,而js默认的是GMT时间格式,js 需要对这个时间进行处理才能使用,具体处理方法如function dateToGMT(sDate){ ...

  6. Beta 集合

    Beta冲刺序列: Beta凡事预则立 :Beta No.0 Beta冲刺Day1:Beta No.1 Beta冲刺Day2:Beta No.2 Beta冲刺Day3:Beta No.3 Beta冲刺 ...

  7. alpha-咸鱼冲刺day3-紫仪

    总汇链接 一,合照 emmmmm.自然还是没有的. 二,项目燃尽图 三,项目进展 今天把数据库的表给建好了,学长那边把登陆跟注册页面也做好了(纯页面,html5+css的那种) 四,问题困难   日常 ...

  8. django搭建web (五) views.py

    http请求: HttpRequest http响应: HttpResponse 所在位置:django.http isinstance(request,HttpResponse) True-> ...

  9. 使用Github pages+jekyll搭建自己的博客(windows版)

    最近突发奇想,想试试GitHub pages来搭建博客.网上一搜一大堆,嗯...看来还是挺简单的...于是自己撸起袖子干...... 结果对于我这种GitHub注册过,git 没用过,ruby.jek ...

  10. 从PRISM开始学WPF(二)Prism?

    目录: 从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WPF(三)Prism-Region? 从PRISM开始学WPF(四)Prism-Modu ...