美文网首页
js中比较两个数组中是否含有相同的元素

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

作者: mujiaxiansheng | 来源:发表于2017-06-06 15:42 被阅读1921次

    原文链接: 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;
      }
    }
    

    相关文章

      网友评论

          本文标题: js中比较两个数组中是否含有相同的元素

          本文链接:https://www.haomeiwen.com/subject/fiagfxtx.html