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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//数组中的成员类型相同,顺序可以不同。例如[1, true] 与 [false, 2]是相似的。
//数组的长度一致。
//类型的判断范围,需要区分:String, Boolean, Number, undefined, null, 函数,日期, window.
function arraysSimilar(arr1, arr2){
//判断边界
if (!(arr1 instanceof Array) || !(arr2 instanceof Array)) {
return false;
}

//判断长度
if (arr1.length != arr2.length) return false;

var i = 0, n = arr1.length, countMap1 = {}, countMap2 = {}, t1, t2, TYPES = ['string', 'boolean', 'number', 'undefined', null, 'function', 'date', 'window'];

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;
}
}

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;
return r;

}

for (i = 0; i < TYPES.length; i++) {
if (countMap1[TYPES[i]] != countMap2[TYPES[i]]) return false;
}

return true;
}
document.write(arraysSimilar([1,true], [false, 2]));

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