数组去重的几种实现方法

1. 使用Set

ES6 提供了新的数据结构Set, 它类似数组,和C++中的set容器一样,它成员的值都是唯一的,没有重复的值;Set本身是一个构造函数,用来生成Set数据结构。

var s = new Set();
s.add("hello").add("goodbye").add("hello");
s.size === 2;
s.has("hello") === true;
const s = new Set();
[2,3,5,4,5,2,2].forEach(x => s.add(x));
for(let i of s) {
    console.log(i);
}
// 2 3 5 4

还有更简单的方式

function dedupe(array) {
    return Array.from(new Set(array));
}
dedupe([1, 1, 2, 3]);//[1, 2, 3]

上面这种方式在于Array.from方法可以将Set结构转化为数组。如果你还觉得不过瘾,那么还有一种表示方式:将扩展运算符(...)与Set结构相结合,就可以去除数组的重复成员;扩展运算符内部使用for...of循环。

[...new Set(array)]

2. indexOf的方法

这种方法新建一个存储数组,遍历参数数组,如果新数组中没找到该元素的索引,则把该元素push进新数组。

function dedupe(array) {
    var newArr = [];
    for(var i=0; i<array.length; i++) {
        if(newArr.indexOf(array[i]) == -1) {
            newArr.push(array[i]);
        }
    }
    return newArr;
}
var arr = [1, 1, 2, 2, 3, 3];
console.log(dedupe(arr));//[1, 2, 3]

3. 比较数组下标

我们知道,通过比较数组下标可以从数组中找到重复的数字,那么自然可以根据数组成员第一次时的索引值i进行判断,该方法类似indexOf的方法。

function dedupe(array) {
    var newArr = [];
    for(var i=0; i<array.length; i++) {
        if(array.indexOf(array[i]) == i) {
            newArr.push(array[i]);
        }
    }
    return newArr;
}
var arr = [1, 1, 2, 2, 3, 3];
console.log(dedupe(arr));//[1, 2, 3]

4. 对象查找

function dedupe(arr) {
    var res = [];
    var o = Object.create(null);
    for(let v of arr) {
        var type = typeof v;
        if(!o[v]) {
            res.push(v);
            o[v] = [type];
        }else if(o[v].indexOf(type) == -1) {
            o[v].push(type);
             res.push(v);
        }
    }
    return res;
}
var arr = [1, 2, ‘2‘, 4, 7, ‘a‘, ‘a‘, 2, 3, 7, 6, 7];
console.log(dedupe(arr));//[1, 2, ‘2‘, 4, 7, ‘a‘, 3, 6]

5. 排序相邻去重

function dedupe(arr) {
    arr.sort();
    var newArr = [arr[0]];
    for(var i=1; i<arr.length; i++) {
        if(arr[i] !== newArr[newArr.length-1]) {
             newArr.push(arr[i]);
        }
    }
    return newArr;
}
var arr = [1, 2, ‘2‘, 4, 7, ‘a‘, ‘a‘, 2, 3, 7, 6, 7];
console.log(dedupe(arr));//[1, "2", 2, 3, 4, 6, 7, "a"]

6. 数组实例的includes方法

function dedupe(arr) {
    var res=[];
    for(let v of arr) {
        if(!res.includes(v)) {
            res.push(v);
        }
    }
return res;
}
var arr = [1, 2, ‘2‘, 4, 7, ‘a‘, ‘a‘, 2, 3, 7, 6, 7];
console.log(dedupe(arr));//[1, 2, "2", 4, 7, "a", 3, 6]

7. 暴力去重

function dedupe(arr) {
    arr.sort();
    console.log(arr);
    for(var i=1; i<arr.length; i++) {
        if(arr[i]===arr[i-1]) {
            arr.splice(i, 1);
             i--;
        }

    }
    return arr;
}
var arr = [1, 2, ‘2‘, 4, 2, 7, ‘a‘, ‘a‘, 2, 3, 7, 6, 7, 7, 7];
console.log(dedupe(arr));
//[1, "2", 2, 2, 2, 3, 4, 6, 7, 7, 7, 7, 7, "a", "a"]
//[1, "2", 2, 3, 4, 6, 7, "a"]

var arr0 = [5, 1, 2, ‘2‘, 4, ‘2‘, 2, 5, 7, ‘a‘, ‘a‘, 2, 3, ‘7‘, 6, ‘7‘, 7, 7];
console.log(dedupe(arr));
//[1, 2, "2", "2", 2, 2, 3, 4, 5, 5, 6, 7, 7, "7", 7, "7", "a", "a"]
//[1, 2, "2", 2, 3, 4, 5, 6, 7, "7", 7, "7", "a"]

上面这种方式最好只用在数字数组或字符串数组去重,由于sort()排序方式的原因,再加上只比较相邻元素是否相等,当出现如arr0类似数组时,去重将会出现遗漏;因此最好对单一类型数组进行去重;

参考:

http://es6.ruanyifeng.com/#docs/set-map

http://es6.ruanyifeng.com/#docs/array

原文地址:https://www.cnblogs.com/princess-knight/p/9276992.html

时间: 2024-08-30 05:00:07

数组去重的几种实现方法的相关文章

数组去重的几种常见方法?

数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ function uniq(array){ var temp = []; //一个新的临时数组 for(var i = 0; i < array.length; i++){ if(temp.indexOf(array[i]) == -1){ temp.push(array[i]); } } retur

JS数组去重的几种常见方法

JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ function uniq(array){ var temp = []; //一个新的临时数组 for(var i = 0; i < array.length; i++){ if(temp.indexOf(array[i]) == -1){ temp.push(array[i]); } } ret

数组去重的几种实现方法。

传统的去重思路大致如下. 声明一个新的数组,在把旧的数组依次往新的数组里面push,如果遇到新数组已有的对象,就不push. var arr =[1,3,3,3,5,6,6,7,8,1,5,9,5]; var newArr = []; //先声明一个对比的方法 function findInArr(arr,n){ for(var i=0;i<arr.length;i++){ if(arr[i]==n)return true;//找到相似的返回true } return false;//遍历完没有

数组去重的几种方法

JS数组去重的几种常见方法 JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ function uniq(array){ var temp = []; //一个新的临时数组 for(var i = 0; i < array.length; i++){ if(temp.indexOf(array[i]) == -1){ temp.push(arra

js中数组去重的几种方法

js中数组去重的几种方法         1.遍历数组,一一比较,比较到相同的就删除后面的                 function unique(arr){                         for(var i=0;i<arr.length;i++){                                 for(var j=i+1;j<arr.length;j++){                                         if(ar

Javascript数组去重的几种方法

Javascript数组去重的几种方法 新建空数组,通过for...of(ES6)循环遍历,通过indexOf判断元素是否在新数组中存在,将不存在的(indexOf(n)==-1)元素push到新数组中: let arr = [1,1,2,2,3,6,3,77,88,5,98,9,7,2,7,5,3,4,2]; function removeDup_indexOf(originalArr){ let newArr = []; for(n of originalArr){ if(newArr.in

【学】数组去重的3种方式

数组去重的3种方式 var arr = [1,4,2,3,4,5,6,7,3,4,5,23,2,3,4,5,3,2,3,4,5];   function findInArray(n,arr){ for (var i=0; i<arr.length; i++) { if(arr[i]==n){ return true; } } return false; }   function removeRep1(arr){ //方法2 var arr1 = []; for (var i=0; i<arr.

有序数组去重的几种算法

最差的算法: 最差的算法: 去重,与数组是否有序无关 public void noDups(){ //从0开始遍历 for(int i=0; i<nElems-1; i++){ //与后面每一个比较 for(j=i+1; j<nElems; j++){ //如果相等,后面的所有的项向前移动,总数-1 if(a[i]==a[j]){ for(k=j+1; k<nElems; k++){ a[j] = a[j+1]; nElems--; } } } } } 把后面不同的往前 public v

JavaScript数组去重的四种方法

今天,洗澡的想一个有趣的问题,使用js给数组去重,我想了四种方法,虽然今天的任务没有完成,5555: 不多说,po代码: //方法一:简单循环去重    Array.prototype.unique1 = function(){                var temp = [];        for(var i=0; i < this.length; i++){            if(temp.indexOf(this[i]) == -1){                tem