该编程题目主要考察对数据类型判断的处理。题目要求正确区分基本类型,同时对象类型也有多种区分,所以使用typeof不能满足条件,需要自己扩展。
以下为一种解法:
/** * String, Boolean, Number, undefined, null, 函数,日期, window */ function arraysSimilar(arr1, arr2) { // 判断参数,确保arr1, arr2是数组,若不是直接返回false if (!(arr1 instanceof Array) || !(arr2 instanceof Array)) { return false; } // 判断长度 if (arr1.length !== arr2.length) return false; var i = 0, n = arr1.length, countMap1 = {}, // 用来计算数组元素数据类型个数的map,key是TYPES中的类型字符串,value是数字表示出现次数。 countMap2 = {}, t1, t2, TYPES = ['string', 'boolean', 'number', 'undefined', 'null', 'function', 'date', 'window']; // 因为是无序的,用一个对象来存储处理过程。key为类型, value为该类型出现的次数。 // 最后校验:若每一种数据类型出现的次数都相同(或都不存在),则证明同构。 for (; 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; } } // 因为typeof只能判断原始类型,且无法判断null(返回"object"),所以自己写typeof方法扩展。 function typeOf(ele) { var r; if (ele === null) r = 'null'; // 判断null else if (ele instanceof Array) r = 'array'; // 判断数组对象 else if (ele === window) r = 'window'; // 判断window else if (ele instanceof Date) r = 'date' // 判断Date对象 else r = typeof ele; // 其它的,使用typeof判断 return r; } for (i = 0, n = TYPES.length; i < n; i++) { if (countMap1[TYPES[i]] !== countMap2[TYPES[i]]) { return false; } } return true; }
请结合注释去看就好,有问题回帖。
另外也给网友XadillaX提供的较为精妙的解法:
var global = window; function arraysSimilar(arr1, arr2){ return (arr1 instanceof Array && arr2 instanceof Array) && JSON.stringify(arr1.map(function(v) { return null === v ? "☀" : (v instanceof Date ? "❤" : (v === global ? "❀" : typeof v)); }).sort()) === JSON.stringify(arr2.map(function(v) { return null === v ? "☀" : (v instanceof Date ? "❤" : (v === global ? "❀" : typeof v)); }).sort()); }
如何将数组的每个值与另一数组的所有值做比较,肯定要双重for,其他不知道
for(i=0,i<arr1.length, i++){
for(j=0,j<arr2.enght,i++){
objet.prototype.class(array1【i】)=objet.prototype.class(array2【j】)
}
}
function array(arr1,arr2){
if(arr1 instanceof Array&&arr2 instanceof Array)
;else{
document.write("不相似");
return false;
};
if(arr1.length==arr2.length);
else { document.write("不相似");
return false;
};
if(exist(arr1,Object)==exist(arr2,Object));
else { document.write("不相似");
return false;
};
if(exist(arr1,Number)==exist(arr2,Number));
else { document.write("不相似");
return false;
};
if(exist(arr1,String)==exist(arr2,String));
else { document.write("不相似");
return false;
};
if(exist(arr1,Boolean)==exist(arr2,Boolean));
else { document.write("不相似");
return false;
};
document.write("数组相似");
return true;
}
function exist(arr,object){
for(var i=0;i<arr.length;i++)
{if(arr[i] instanceof object==true)
return true;
}return false;}
这门课程是不是还没做完啊,还有后续章节?
我去这第二种还有小花太阳什么的。。略高深
好深奥!!
for (i = 0, n = TYPES.length; i < n; i++) { if (countMap1[TYPES[i]] !== countMap2[TYPES[i]]) { return false; } }
这段判断成员类型?不是说顺序不同吗……这样判断不就是要按照顺序来吗。小白表示不理解
第二段代码里面,return null === v ? "☀" : (v instanceof Date ? "❤" : (v === global ? "❀" : typeof v));
怎么显示的太阳 心 和花? 只有我一个人浏览器这样么?还是说本来就是太阳,心 和花 ? = =
function arraysSimilar(arr1, arr2){
if(arr1.length!=arr2.length)
{
document.write("判定结果:不通过");
}
else
{
foreach(a1 in arr1)
{
foreach(b1 in arr2)
{
if(typeof a1!=typeof b1){return false;}
}
}
return true;
}
}
这样写对不对啊?
http://gaohaoyang.github.io/2015/04/06/arrays-similar/
我写的这个代码如何?没有用任何JavaScript的函数,我自己想了好久才写出来的。
老师看一下吧~
第二种方法完全不知是啥,不过扎扎实实的先练好第一种吧
我去,你们这两种方法对初学者而言 有点天书了 在一个这种题目需要逻辑
我也觉得先通过排序,然后获取类型,最后arrType1.toString()和arrType2.toString()一比较就可以了
for (; 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; } }
这一段看不懂额,求解释。。。
通过sort()排序将无序变有序,这样判断就容易多了
赞。。。