原文链接: http://blog.csdn.net/u010085362/article/details/52036752#comments
//做比较的两个数组
var array1 = ['a','b','c','d','e'];//数组1
var array2 = ['d','f','e','a','p'];//数组2
//临时数组存放
var tempArray1 = [];//临时数组1
var tempArray2 = [];//临时数组2
for(var i=0;i<array2.length;i++){
tempArray1[array2[i]]=true;//将数array2 中的元素值作为tempArray1 中的键,值为true;
}
for(var i=0;i<array1.length;i++){
if(!tempArray1[array1[i]]){
tempArray2.push(array1[i]);//过滤array1 中与array2 相同的元素;
}
}
console.log(tempArray2)
结果:
出{‘b’,‘c’};
这篇文章的精彩之处在于评论,
假设array1 = ["toString", "a", "b"]
array2 = [] //空数组
套用你的方法得到最后的tempArray2, 按理说应该是["toString", "a", "b"], 因为array2是个空数组, 按理说应该不会从array1中过滤掉任何东西.
但是最后的结果是console.log(tempArray2) //["a", "b"]
也就是说array1中的"toString"这个元素被过滤掉了.
原因很简单: 第10行的检测出了错误, tempArray1["toString"]是定然存在的, 每个数组(即便是空数组)也会有这个"toString"属性, 这样就导致array1中的如果含有"toString"这个元素, 就一定会被过滤掉, 不管有没有和Array2中的元素重合.
同理, 如果array1中含有"toString", "valueOf","toLocaleString"这些字符串元素, 也是必然会被过滤掉的.
评论提出了问题,把上述代码的中的
for(var i=0;i<array2.length;i++){
tempArray1[array2[i]]=true;//将数array2 中的元素值作为tempArray1 中的键,值为true;
}
修改为:
for(var i=0; i<array2.length; i++){
if (!tempArray1.hasOwnProperty(array1[i])) {
tempArray1[array2[i]]=true;
}
}
网友评论