js数组去重算法

时间:2022-09-03 17:43:19

  来来来 ,整理完数组排序 ,咱们再来看看数组去重 。这个可以说有很多方式了 。之前看过的算法方式太多 ,导致思路其实有时候真的很受限,不过也是整理来学习用的 啊,小婊贝们~

  首先呢 ,我们来看看思路比较直接的方法,基本思路就是声明一个新数组arr_n,将【0】这个成员压入arr;然后从【1】开始循环当前数组,设置一个变量a,给他一个初始值1;内层嵌套从【0】对arr_n数组的循环 ,用外层对当前数组循环的当前项this[i]和arr_n的每一项arr_n[j]进行对比,如果有相等,则将0赋值给a,然后break退出内层循环;判断a的值,若等于初始值则说明遍历完arr_n并没有重复,则将当前this[i]压入新数组 arr_n,以此类推 ,直到所有排序完成 ,返回新数组 arr_n;    代码如下:

Array.prototype.unique=function(){
    var arr_n=[];
    arr_n.push(this[0]);
    for(var i=1;i<this.length;i++){
        var a=1;
        for(var j=0;j<arr_n.length;j++){
            if(this[i]==arr_n[j]){
                a=0;
                break;
            }
        }
        if(a==1){
            arr_n.push(this[i]);
        }
    }
    return arr_n;
};
var a=[1,3,4,3,5,2,5];
a.unique();

  最近在看JavaScript面向对象编程这本书时发现了一个特别好的API是indexOf,后来网上查了查用在数组上其实也是很棒的有木有 ,不过还是有坑的 ,下面关于indexOf对数组用法是复制来的 ,因为觉得很浅显易懂了,大家共勉 ,大家看看别踩了坑 就行;再者就是 indexOf是ES5的语法 ,不支持IE8以下的浏览器(无奈摊手~ )

let arr = ['orange', '2016', '2016'];
 
arr.indexOf('orange'); //0
arr.indexOf('o'); //-1
 
arr.indexOf('2016'); //1
arr.indexOf(2016); //-1
这里没把例子拆的那么细,四个用例足以说明问题。
    arr.indexOf(‘orange') 输出 0 因为 ‘orange' 是数组的第 0 个元素,匹配到并返回下标。
    arr.indexOf(‘o') 输出 -1 因为此方法不会在每一个元素的基础上再次执行 indexOf 匹配。
    arr.indexOf(‘2016') 输出 1 因为此方法从头匹配直到匹配到时返回第一个数组元素的下表,而不是返回全部匹配的下标。
    arr.indexOf(2016) 输出 -1 注意:这里不会做隐式类型转换。

以下是运用indexOf的代码段:

Array.prototype.unique1=function(){
    var arr_n=[];
    arr_n.push(this[0]);
    for(var i=1;i<this.length;i++){
        if( arr_n.indexOf(this[i])==-1){
            arr_n.push(this[i]);
        }
    }
    return arr_n;
}
var b=[12,3,4,5,3,5,3,7,12];
b.unique1();

还有一种方法 ,我认为是比较好的了 ,简洁又不存在兼容性问题,思路也很简单 ,先声明一个空数组和一个object对象,循环遍历当前数组,将数组的每一项当做object的属性来看 ,判断对象是否已有当前项的属性即可 ,若不重复,将当前this[i]push进新数组,给object的this[i]属性赋个值即可,最后返回新数组;代码如下:

Array.prototype.unique2=function(){
    var arr_n=[],obj={};
    for(var i=0;i<this.length;i++){
        if(!obj[this[i]]){
            arr_n.push(this[i]);
            obj[this[i]]=1;
        }
    }
    return arr_n;
};
var b=[12,3,4,5,3,5,3,7,12];
b.unique2();

如果你也刚好入门 ,刚好对去重算法比较懵懂 ,希望对你有些许帮助!