编程练习--判断两个数组中数据的数据类型是否相同
代码是慕课练习题
这里提供的数据是一个数组中包含多个对象,要求比较每个对象中的属性arr1和arr2对应的数组中元素的类型是否相同。……有点绕,这是我的理解啦
原题目要求:
请在index.html文件中,编写arraySimilar函数,实现判断传入的两个数组是否相似。具体需求:
1.数组中的成员类型相同,顺序可以不同。例如 [1,ture] 与 [false,2] 是相似的。
2.数组的长度一致
3.类型的判断范围,需要区分:String,Boolean,Number,undefined,null,函数,日期,window.
当以上全部满足,则返回“判定结果:通过”,否则返回“判定结果:不通过”。
参考答案:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script> function arraysSimilar(arr1,arr2) { //判断边界 if(!(arr1 instanceof Array)||!(arr2 instanceof Array)){ return false; } //判断长度 if(arr1.length!==arr2.length){ return false; } var n=arr1.length, countMap1={}, countMap2={}, t1, t2, TYPES=['string','boolean','number','undefined','null','function','date','window']; for(var i=0;i<n;i++){ t1=typeOf(arr1[i]); t2=typeOf(arr2[i]); if(countMap1[t1]){ countMap1[t1]++; }else{ countMap1[t1]=1; } if(countMap2[t2]){ countMap2[t2]++; }else{ countMap2[t2]=1; } } function typeOf(ele){ var r; if(ele===null) r='null'; else if(ele instanceof Array) r='array'; else if(ele===window) r='window'; else if(ele instanceof Date) r='date'; else r=typeof ele; console.log(r); return r; } console.log(countMap1); console.log(countMap2); for(j=0,n=TYPES.length;j<n;j++){ if(countMap1[TYPES[j]]!==countMap2[TYPES[j]]){ return false; } } return true; } 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函数,具体要求,详见任务要求。 console.log(cases.length); for (var m= 0;m< cases.length;m++) { console.log(cases[m]) if (arraysSimilar(cases[m].arr1, cases[m].arr2)!== cases[m].expect) { document.write("不通过!case" + (m+1) + "不正确!arr1=" + JSON.stringify(cases[m].arr1) + ", arr2=" + JSON.stringify(cases[m].arr2) + " 的判断结果不是" + cases[m].expect); return false; } } return true; }() </script> </body> </html>
//自己瞎写的 题目都没理解清楚…… 放到这里当作提醒自己好了 function arraysSimilar(a,b){ if(Object.prototype.toString.call(a)===Object.prototype.toString.call(b)){ if(a instanceof Array){ //数组 if(a.length==b.length){ for(var i=0;i<a.length;i++){ for(var j=0;j<b.length;b++){ if( a[i]==b[j]){ return true }else{ // return false } } return false; } }else{ return false; } }else{ if(a===b){ return true; }else{ return false; } } }else{ return false; } }