• 两数组比较,筛选出不同元素(附数组去重)


    群里闲聊,聊到了这个问题,有大佬回答,特此记录学习;
    先说一下问题:
     
     
    两种方式:一种是使用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;">





  • 相关阅读:
    Known Notation括号匹配类问题(2014年ACM/ICPC 亚洲区域赛牡丹江)
    01串LIS(固定串思维)--Kirk and a Binary String (hard version)---Codeforces Round #581 (Div. 2)
    大学生究竟哪种姿势查成绩
    让你的手机缓存视频在电脑上播放
    亲,你的多功能工具箱到了,麻烦签收一下
    真WIFI密码查看器
    爱剪辑永久vip版爱要不要
    这两款ios和Android的免费影视神器最近火爆了
    全球免费直播软件爱要不要
    一次性给你上万款黑科技软件,留着自己悄悄用吧。
  • 原文地址:https://www.cnblogs.com/DreamSeeker/p/5379c1c3b7c5b342a0ca7c118eb083a2.html
Copyright © 2020-2023  润新知