当前位置: 首页 > news >正文

js中数组去重的几种实现方式(区别)

1. 利用ES6的 set 方法(常用)
说明:

  • set:Set是ES6的新数据结构,类似于数组,但本身没有重复值
  • 展开运算符(…): 展开set,转化为数组
  • Array.from:Array.from可以用于将两类对象转为真正的数组:类似数组对象;可遍历对象

缺点:无法去除数组中的空对象

let ary = [12, 23, 12, 15, 25, 23, 25, 14, 16];
ary = [...new Set(ary)];
console.log(ary);
let ary = [12, 23, 12, 15, 25, 23, 25, 14, 16];
ary = Array.from(new Set(ary));
console.log(ary);

2. 其余方法

// 1,2,3,'a','2',null,NaN,undefined,{a:1},true 10项
        var arr = [3,'a', 1, 2, 2, 3, '2', 3, null, NaN, null, NaN, undefined, {size:1}, undefined, true, {size:1}, true];
        // 方法一:利用splice方法去重
        // 说明:用双层for循环嵌套,用每一项与另外得其他项一一对比,若相同则删除后面的相同项
        function newArr(arr) {
            for(var i=0; i<arr.length; i++) {
                for(var j=i+1; j<arr.length; j++) {
                    if(arr[i] == arr[j]) {
                        arr.splice(j,1);
                        j--;
                    }
                }
            }
            return arr;
        }
        console.log(newArr(arr)); 

        // 0: 3
        // 1: "a"
        // 2: 1
        // 3: 2
        // 4: null
        // 5: NaN
        // 6: NaN
        // 7: {size: 1}
        // 8: {size: 1}
        // length: 9

        // 缺少:underfined ,true
        // 无法处理: NaN, {size:1} ,2 与 '2'

        // 方法二:indexOf
        // 说明:创建一个新数组,在新数组中利用indexOf方法判断数组中是否有相同值,无则返回-1,然后将该项push进去新数组
        function newArr2(arr) {
            var result =[];
            for(var i=0; i<arr.length; i++) {
                if(result.indexOf(arr[i]) == -1) {
                    result.push(arr[i])
                }
            }
            return result;
        }
        console.log(newArr2(arr))

        // 0: 3
        // 1: "a"
        // 2: 1
        // 3: 2
        // 4: "2"
        // 5: null
        // 6: NaN
        // 7: NaN
        // 8: undefined
        // 9: {size: 1}
        // 10: true
        // 11: {size: 1}
        // length: 12

        // 缺少: 无
        // 无法处理: NaN, {size:1}

        // 方法三:Set 与 Array.from
        // 说明:Set是ES6的新数据结构,类似于数组,但本身没有重复值,Array.from可以用于将两类对象转为真正的数组:类似数组对象,可遍历对象
        function newArr3(arr) {
            return Array.from(new Set(arr));
        }
        console.log(newArr3(arr))

        // 0: 3
        // 1: "a"
        // 2: 1
        // 3: 2
        // 4: "2"
        // 5: null
        // 6: NaN
        // 7: undefined
        // 8: {size: 1}
        // 9: true
        // 10: {size: 1}
        // 11: {}
        // 12: {}
        // length: 13

        // 缺少:无
        // 无法处理: {size:1} ,{}


        // 方法四:扩展运算符与Set
        // 说明:使用...简化了方法三的代码
        var newArr4 = [...new Set(arr)];
        console.log(newArr4);

        // 0: 3
        // 1: "a"
        // 2: 1
        // 3: 2
        // 4: "2"
        // 5: null
        // 6: NaN
        // 7: undefined
        // 8: {size: 1}
        // 9: true
        // 10: {size: 1}
        // length: 11
        
        // 缺少: 无
        // 无法处理: {a:1}

        // 方法五:利用对象属性去重
        // 说明:每次去原数组的元素,然后再对象中访问这个属性,在进行对比、
        Array.prototype.unique = function(){
            var temp = {};
            var newArr = [];
            for(var i=0; i < this.length; i++) {
                if(!temp.hasOwnProperty(this[i])) {
                    temp[this[i]] = this[i];
                    newArr.push(this[i])
                }
            }
            return newArr;
        }
        console.log(arr.unique());

        // 0: 3
        // 1: "a"
        // 2: 1
        // 3: 2
        // 4: null
        // 5: NaN
        // 6: undefined
        // 7: {size: 1}
        // 8: true
        // length: 9

        // 无法识别:无
        // 无法处理: '2' 与 2
        // 推荐使用

        // 方法六: sort排序
        // 说明:先判断是否为数组; 
        // 通过sort方法将排序后的数组保存在临时变量temp中,保存temp的第0项即为1,再通过for循环对比前后两项的值,不同则存入数组
        function newArr5(arr) {
            if(!Array.isArray(arr)) {
                console.log('type error!')
                return;
            }
            temp = arr.sort();
            var result = [temp[0]];
            for(var i =1; i<arr.length; i++) {
                if(temp[i] !== temp[i-1]) {
                    result.push(temp[i]);
                }
            }
            return result;
        }
        console.log(newArr5(arr));

        // 0: 1
        // 1: 2
        // 2: "2"
        // 3: 3
        // 4: NaN
        // 5: NaN
        // 6: {size: 1}
        // 7: {size: 1}
        // 8: "a"
        // 9: null
        // 10: true
        // 11: undefined
        // length: 12

        // 无法识别:无
        // 无法处理: NaN , {size:1}

相关文章:

  • java创建文件和目录
  • JS For循环中嵌套setTimeout()方法的理解
  • ubuntu下zabbix服务器监控工具部署
  • 前端性能优化-图片
  • MapString, String循环遍历的方法
  • 快速掌握js中闭包的理解与应用(面试中如何回答闭包)
  • inkspace 0.92 安装 总结
  • js中原型,原型链的理解
  • CSS水平、垂直居中问题.md
  • Vue3写法总结
  • [python] os.path说明
  • vue-cli3+ 打包至非根目录静态资源(图片,字体文件)路径加载错误,导致不显示,丢失
  • 讲座:Influence maximization on big social graph
  • Vue3中组件的挂载及调用
  • HDFS 核心原理
  • @angular/forms 源码解析之双向绑定
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • Django 博客开发教程 8 - 博客文章详情页
  • Docker下部署自己的LNMP工作环境
  • es6--symbol
  • Facebook AccountKit 接入的坑点
  • Java 网络编程(2):UDP 的使用
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • js
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Python_网络编程
  • Redis中的lru算法实现
  • text-decoration与color属性
  • 程序员该如何有效的找工作?
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 聊聊flink的TableFactory
  • C# - 为值类型重定义相等性
  • UI设计初学者应该如何入门?
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • (rabbitmq的高级特性)消息可靠性
  • (二)hibernate配置管理
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .Net FrameWork总结
  • .Net的C#语言取月份数值对应的MonthName值
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net经典笔试题
  • .net开发引用程序集提示没有强名称的解决办法
  • .net下的富文本编辑器FCKeditor的配置方法
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [AR Foundation] 人脸检测的流程
  • [BUG]Datax写入数据到psql报不能序列化特殊字符
  • [Foreman]解决Unable to find internal system admin account
  • [IDF]啥?