js中比较两个数组中是否含有相同的元素

2017-06-06  本文已影响1921人  mujiaxiansheng

原文链接: 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;
  }
}
上一篇 下一篇

猜你喜欢

热点阅读