Javascript学习记录——数组去重

 var arr = [1, 2, 3, 5, 5, ‘45‘, ‘45‘, 4, 1, ‘1‘, ‘2‘]
    for (var i = 0; i < 10000; i++) {
        arr.push(i)//这里给arr添加10000项,方便后面对各个方法性能的观看
    }

    /**
     * 方法一:借用一个结果数组,原数组中的元素与结果数组进行比较,若是不存在与原数组全等的元素,则将原数组元素存入结果数组中。
     * @param arr 传入的数组
     * @returns {Array} 返回的去重后的数组
     */
    function useArr(arr) {//封装函数
        var start = +new Date()//得到初始时间
        var resultArr = []//新建一个resultArr,用来保存非重复元素
        resultArr.push(arr[0])//在resultArr可以任意添加一个arr中的元素,保证后面能进入到内层for循环中
        for (var i = 1; i < arr.length; i++) {//遍历arr,从索引为1的元素开始
            var flag = true//这里利用假设成立法声明一个变量,假设arr中的第i项与resultArr中的每一项都不全等。
            for (var j = 0; j < resultArr.length; j++) {//遍历resultArr
                if (arr[i] === resultArr[j]) {//将arr的第i项与resultArr中的每一项进行比较
                    flag = false//如果resultArr中存在与arr第i项全等的元素,那么假设不成立,令flag为false,
                    break//既然有了重复的项,那么其他的项也就不用比了,直接结束内层for循环
                }
            }
            if (flag) {//如果假设成立,即resultArr中没有与arr第i全等的元素,那么就将arr添加到resultArr中
                resultArr.push(arr[i])
            }
        }
        var end = +new Date()//得到结束时间
        console.log(end - start)//输出时间差       结果约为 260ms
        return resultArr//返回结果数组
    }

    console.log(useArr(arr))

    /**
     * 方法二:arr中的元素与后面元素比较,如果存在与之全等的元素,则删除后面元素
     * @param arr
     * @returns {Array}
     */
    function useArr1(arr) {//封装函数
        var start = +new Date()//得到初始时间
        for (var i = 0; i < arr.length; i++) {//遍历arr
            for (var j = i + 1; j < arr.length; j++) {//遍历第i项后面的所有项
                if (arr[i] === arr[j]) {//比较第i项与其后面的所有项
                    arr.splice(j, 1)//若存在第J项与第i项全等,则删除第j项
                    j--//因为删除了一项j,j+1项会变为j项,为使得后面的比较顺利进行,这时就要进行j--
                }
            }
        }
        var end = +new Date()//得到结束时间
        console.log(end - start)//输出时间差     结果约为 193ms
        return arr;//返回去重后的原数组
    }
    console.log(useArr1(arr))

    /**
     * 方法三:使用indexOf,寻找resultArr中是否存在与arr中相等的元素,若没有则将arr的元素放入resultArr中
     * @param arr 传入的数组
     * @returns {Array} 返回的去重后的数组
     */
    function useArr2(arr) {//封装函数
        var start = +new Date()//得到初始时间
        var resultArr = []//新建一个resultArr,存放非重复元素
        for (var i = 0; i < arr.length; i++) {//遍历arr
            if (resultArr.indexOf(arr[i]) == -1) {//在resultArr中寻找是否存在与arr的第i项相等的元素,结果为-1表示不存在(indexOf寻找的是全等元素)
                resultArr.push(arr[i])//结果数组中若不存在与arr第i项相等的元素,则将arr的第i项存入resultArr中
            }
        }
        var end = +new Date()//得到结束时间
        console.log(end - start)//输出时间差     结果约为244ms
        return resultArr//返回结果数组
    }
    console.log(useArr2(arr))

    /**
     * 方法四:数组中元素与自身元素进行比较,跳过有重复项的左值,每次取没有重复项的最右值,
     * @param arr 传入的数组
     * @returns {Array} 返回的去重后的数组
     */
    function useArr3(arr) {//封装函数
        var start = +new Date()//得到初始时间
        var resultArr = []//新建一个resultArr,保存去重后的元素
        for (var i = 0; i < arr.length; i++) {//遍历arr
            for (var j = i + 1; j < arr.length; j++) {//取出第i项后面的比较项
                if (arr[i] === arr[j]) {
                    j = ++i//如果在第i项后面存在与第i项全等的元素,那么就跳过第i项,从i+1项开始,再次比较(虽然内层循环还在继续
                           //但外层相当于进入下一次的i循环),直到内层for循环走完依旧没有全等的元素
                }
            }
            resultArr.push(arr[i])//如果第i项后面与之全等的元素,那么就将arr的第i项添加到resultArr中
        }
        var end = +new Date()//得到结束时间
        console.log(end - start)//输出时间差     结果约为 214ms
        return resultArr//返回去重后的数组
    }
    console.log(useArr3(arr))

    /**
     * 方法五:使用对象,在对象中查找是否存在以数组元素为属性的属性,若是不存在,则将该元素添加到对象的属性中,
     *        因为中括号内的属性名都是以字符串形式进行查找,因此会将类似数值1与字符串‘1‘当做重复项,这时就要
     *        可以将数值元素的类型值作为属性值保存在对应的属性中
     * @param arr 传入的数值
     * @returns {Array} 返回的去重后的数值
     */
    function useArr4(arr) {//封装函数
        var start = +new Date()//得到初始时间
        var obj = {}, resultArr = [];//新建一个空对象,进行比较,一个空数组保存非重复元素
        for (var i = 0; i < arr.length; i++) {//遍历arr
            var type = typeof arr[i]//声明一个变量,保存数组中第i项元素值的类型
            if (!obj[arr[i]]) {//判断:如果对象中的数组元素属性不存在
                obj[arr[i]] = type//那么就将数组元素保存为对象的属性,并将数组元素值的类型保存为属性值
                resultArr.push(arr[i])//同时将满足条件的数组元素添加到resultArr中
            } else if (obj[arr[i]].indexOf(type) == -1) {//接着判断:未满足上一个if条件的所有arr的元素进入到这个else if中,以这些元素作为对象的属性查找属性值
                //如果没有与之相等(不全等)的属性的属性值,也就是数组中存在与该相等但不全的元素,那么就将该元素添加到resultArr中
                resultArr.push(arr[i])
            }
        }
        var end = +new Date()//得到结束时间
        console.log(end - start)//输出时间差     结果约为 3ms
        return resultArr//返回去重后的数组
    }
    console.log(useArr4(arr))

    //方法五的性能最佳,但是新建了一个对象,占用空间即内存大,空间换时间
时间: 2024-12-28 08:00:02

Javascript学习记录——数组去重的相关文章

JavaScript学习记录day2

JavaScript学习记录day2 学习 javascript JavaScript学习记录day2 1.1 数据类型 1.2 变量 1.1.1 Number 1.1.2 字符串 1.1.3 布尔值 1.1.4 比较运算符 1.1.5 null和undefined 1.1.6 数组 1. 数据类型和变量 1. 数据类型和变量 1.1 数据类型 1.1.1 Number JavaScript不区分整数和浮点数,统一用Number表示,以下都是合法的Number类型: 123; // 整数1230

JavaScript学习记录day5-函数的定义和调用

JavaScript学习记录day5-函数的定义和调用 [TOC] 1. 定义函数 在JavaScript中,定义函数的方式如下: function abs(x) { if (x >= 0) { return x; } else { return -x; } } 上述abs()函数的定义如下: function指出这是一个函数定义:abs是函数的名称:(x)括号内列出函数的参数,多个参数以,分隔:{ ... }之间的代码是函数体,可以包含若干语句,甚至可以没有任何语句.请注意,函数体内部的语句在

JavaScript学习记录day7-高阶函数

JavaScript学习记录day7-高阶函数 [TOC] 1. 什么是高阶函数 高阶函数英文叫Higher-order function.那么什么是高阶函数? JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数. 一个最简单的高阶函数: function add(x, y, f) { return f(x) + f(y); } 当我们调用add(-5, 6, Math.abs)时,参数x,

JavaScript学习记录day9-标准对象

JavaScript学习记录day9-标准对象 [TOC] 在JavaScript的世界里,一切都是对象. 但是某些对象还是和其他对象不太一样.为了区分对象的类型,我们用typeof操作符获取对象的类型,它总是返回一个字符串: typeof 123; // 'number' typeof NaN; // 'number' typeof 'str'; // 'string' typeof true; // 'boolean' typeof undefined; // 'undefined' typ

JavaScript学习记录day1

JavaScript学习记录day1 学习 javascript JavaScript学习记录day1 1. 快速入门 2. 编程工具 3. 语法 4. 注释 5. 大小写 JavaScritps 是什么? JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能. 在Web世界里,只

javascript 学习记录

关于牛B的Jquery源头 (function(){ //这里省略jQuery所有实现 })(); 1:无论你怎么去定义你的函数 JS解释器都会把它翻译成一个 Function对象 2:那什么是Function? Function对象是javascript里面 固有对象,所有的函数实际上都是一个 Function对象 3: alert(typeof function(){});// "function" alert(typeof function(x,y){return x+y;});

Javascript中的数组去重-indexof方法

在Javascript中,有时我们会用到数组去重.我在这里给大家介绍一下本人认为最简单实用的一种方法-indexOf()去重. 1 var arr = [1,1,1,2,2,2,3,3,4,5,6,2,1]; 2 var arr2 = []; 3 for(var i = 0;i < arr.length;i++){ 4 if(arr2.indexOf(arr[i]) == -1){ 5 arr2.push(arr[i]) 6 } 7 } 8 console.log(arr2) //[1,2,3,

JavaScript tips:数组去重

1.实现目标:数组去重 2.实现思路: (1)创建新数组. (2)遍历原数组,判断当前被遍历元素是否存在于新数组,如果存在于新数组,则判断当前被遍历元素是重复的:如果不存在于新数组,则判断当前被遍历元素不是重复的,则将其压入新数组. (3)遍历完毕原数组后,返回新数组. 3.具体实现:根据对当前元素是否重复的判断方法不同,有四种不同的具体实现. (1)利用hash表保存被遍历元素是否重复的状态. 1 function unique( arr ) { 2 var n = {}, //hash表,用

JavaScript学习--Item30 数组进阶全掌握

在程序语言中数组的重要性不言而喻,JavaScript中数组也是最常使用的对象之一,数组是值的有序集合,由于弱类型的原因,JavaScript中数组十分灵活.强大,不像是Java等强类型高级语言数组只能存放同一类型或其子类型元素,JavaScript在同一个数组中可以存放多种类型的元素,而且是长度也是可以动态调整的,可以随着数据增加或减少自动对数组长度做更改. 1.创建数组 在JavaScript多种方式创建数组 1.构造函数 1.无参构造函数,创建一空数组 var a1=new Array()