zoukankan      html  css  js  c++  java
  • 两数组比较,筛选出不同元素(附数组去重)

    群里闲聊,聊到了这个问题,有大佬回答,特此记录学习;
    先说一下问题:
     
     
    两种方式:一种是使用ES6的写法,逼格高大上:
        
    let a=[1,2,3,4], b=[1,2,3,5,4,6],
    c = [...a, ...b],
    d = new Set(c),
    e = Array.from(d),
    f = [...e.filter(_=>!a.includes(_)),...e.filter(_=>!b.includes(_))];
    console.log(f);//[5, 6]
     
     
    我知道ES6已经流行开了,但对我来说还是某些查了资料才看明白,菜啊!
    首先,其中的 "..." ,三个点也就是省略号是是ES对数组新添加的方法,学名叫做扩展运算符,他的主要作用有制数组、合并数组、与解构赋值结合、字符串转数组、实现了 Iterator 接口的对象、Map 和 Set 结构,Generator 函数(点击查看阮一峰老师的讲解),
    这里用到的就是数组的合并,将其合并为一个数组。
    然后,d的作用,转化为一个set,set是ES6提供的一种数据结构,这里主要用到是它不包含重复元素的特点,这样转化成了一个没有重复元素的数据结构(不敢说成集合和数组),数组去重so easy!
    再然后,e变量作用简单明了,把d的这种类数组数据结构转化为数组,数组中包含的仍是两个数组的并集
    再然后,f变量里面东西就多点了,首先是includes方法。看名称应该知道是包含的意思,这个就是a包含这个元素则返回true,否则返回false,数组的filter方法在接受到includes函数的结果取反之后,就筛选除了e中不包含a的元素,再加上e中不包含b的元素,重新组成一个数组,这个数组就是最后的结果;
    我尝试用韦恩图(就是交集、并集、取反那一堆)的方式解释出来,但是数学太渣了,没办法,你们谁数学好的可以私我发过来。。。
     
    第二种方法:(接地气,兼容性好,支持IE8)
    function diff(arr1,arr2){
    var a = [];
    var b = [];
    
    for(var i=0;i<arr2.length;i++){
        a[arr2[i]]=true;
    }
    
    for(var i=0;i<arr1.length;i++){
        if(!a[arr1[i]]){
            b.push(arr1[i]);
        }
    }
    console.log(b)
    }
    let aa = ["a","b"],bb=["a"];
    diff(aa,bb);//"b"
     
     
     
    这个方法一看就明白,简单易懂,并且也是较为稳定的方法,这个不会的就自行谷歌吧。。

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





  • 相关阅读:
    自己第一个github开源的感受
    直播时代--IOS直播客户端SDK,美颜直播【开源】
    OpenCL / OpenGL / OpenAL
    FFmpeg 라이브러리 코덱과 영상 변환을 중심으로
    nginx + http2.0 解决浏览器跨域和同源限制问题
    软件编译系统构建
    SRS支持rtmp/srt/gb28181/webrtc上行推流和rtmp/http-flv/hls/dash/gb28181/webrtc下行拉流
    SIP UA/UAC/UAS/GB28181-Server/GB28181-Client 五合一
    SUPL(安全用户面定位)
    RTMP低延时配置
  • 原文地址:https://www.cnblogs.com/DreamSeeker/p/5379c1c3b7c5b342a0ca7c118eb083a2.html
Copyright © 2011-2022 走看看