zoukankan      html  css  js  c++  java
  • 整理一波数组去重方法

    关于数组去重,一直用的是循环,还有es6的set,查阅资料竟有如此多的去重方法,整理了如下。直接上干货

    循环1

    function unique(arr) {
        var newArr = [];
        var isRepeat;
        for(var i=0; i<arr.length; i++) {
            isRepeat = false;
            for(var j=i+1; j<arr.length; j++) {
                if(arr[i] === arr[j]){
                    isRepeat = true;
                    break;
                }
            }
            if(!isRepeat){
                newArr.push(arr[i]);
            }
        }
        return newArr;
    }
    var arr = [5,6,1,8,1,6];
    console.log(unique(arr)); 

    循环2

    var newArr = [];
    for(var i=0; i<arr.length; i++){
        for(var j=i+1; j<arr.length; j++){
            if(arr[i] === arr[j]){
                j = ++i;
            }
        }
        newArr.push(arr[i]);
    }
    return newArr;
    }
    var arr = [5,6,1,8,1,6];
    console.log(unique(arr)); 

    foreach方法

    遍历传入的数组元素,如果新数组中没有这个元素,就push进去新数组

    function unique(arr) {
        var newArr = [];
        arr.forEach(function(item){ 
            if(newArr.indexOf(item) === -1){
                newArr.push(item);
            }
        });
        return newArr;
    }
    var arr = [5,6,1,8,1,6];
    console.log(unique(arr)); 

    filter方法

    item 表示数组中的每个元素,index 是每个元素的出现位置。indexOf 返回匹的第一个索引。
    function unique(arr) {
        return arr.filter(function(item, index){
            return arr.indexOf(item) === index;
        });
    }

    sort方法

    先排序,再比较相邻的是否相同,不同就push进去新数组

    function unique(arr) {
        var newArr = [];                  
        arr.sort();
        for(var i = 0; i < arr.length; i++){
            if( arr[i] !== arr[i+1]){
                newArr.push(arr[i]);
            }
        }
        return newArr;
    }
    var arr = [5,6,1,8,1,6];
    console.log(unique(arr)); 

    sort方法2

    对数组排序,将第一个元素push进去新数组,再将每个要放进入的元素与新数组的最后一个元素比较,不同就push

    function unique(arr) {
        var newArr = [];                  
        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 = [5,6,1,8,1,6];
    console.log(unique(arr)); 

    对象

    将数组值作为对象的属性,如果重复了就不赋值。

    function unique(arr) {
        var newArr = [];
        var tmp = {};
        for(var i=0; i<arr.length; i++){
            if(!tmp[arr[i]]){
                tmp[arr[i]] = 1;
                newArr.push(arr[i]);
            }
        }
        return newArr;
    }
    var arr = [5,6,1,8,1,6];
    console.log(unique(arr)); 

    但是要注意这个方法不能应对所有情况

    1. 无法区分隐式类型转换成字符串后一样的值,比如 1 和 '1' 。

    2 .无法处理复杂数据类型,比如对象(因为对象作为 key 会变成 [object Object] )。

    3. 特殊数据,比如 '__proto__' ,因为 tmp 对象的 __proto__ 属性无法被重写。

    对象的升级1

    function unique(arr) {
        var newArr = [];
        var tmp = {};
        var tmpKey;
        for(var i=0; i<arr.length; i++){
            tmpKey = typeof arr[i] + arr[i];
            console.log(tmpKey); 
            if(!tmp[tmpKey]){
                tmp[tmpKey] = 1;
                newArr.push(arr[i]);
            }
        }
        return newArr;
    }
    var arr = [5,6,'1',8,1,6];
    console.log(unique(arr)); 

    对象升级2

    function unique(arr) {
        var newArr = [];
        var tmp = {};
        var tmpKey;
        for(var i=0; i<arr.length; i++){
            tmpKey = typeof arr[i] + JSON.stringify(arr[i]);
            console.log(tmpKey)
            if(!tmp[tmpKey]){
                tmp[tmpKey] = 1;
                newArr.push(arr[i]);
            }
        }
        return newArr;
    }
    var arr = [5,6,1,8,1,6];
    console.log(unique(arr)); 

    es6 map

    Map 是一种新的数据类型,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。

    function unique(arr) {
        var newArr = [];
        var tmp = new Map();
        for(var i=0; i<arr.length; i++){
            if(!tmp.get(arr[i])){
                tmp.set(arr[i], 1);
                newArr.push(arr[i]);
            }
        }
        return newArr;
    }
    var arr = [5,6,1,8,1,6];
    console.log(unique(arr)); 

    es6 set

    Array.from() 方法从一个类似数组或可迭代对象中创建一个新的数组实例。

    function unique(arr){
        var set = new Set(arr);
        return Array.from(set);
    }
    var arr = [5,6,1,8,1,6];
    console.log(unique(arr)); 

    includes()方法

    includes()方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false。

    function unique(arr) {
        var newArr = [];
        arr.forEach(function(item){
            if(!newArr.includes(item)){
                newArr.push(item);
            }
        });
        return newArr;
    }
    var arr = [5,6,1,8,1,6];
    console.log(unique(arr)); 
  • 相关阅读:
    【二】MongoDB入门
    【三】MongoDB文档的CURD操作
    【四】MongoDB索引管理
    【五】MongoDB管理之生产环境说明
    【六】MongoDB管理之副本集
    【七】MongoDB管理之分片集群介绍
    【八】MongoDB管理之分片集群实践
    【九】MongoDB管理之安全性
    mysql5.7新特性探究
    19.SSM整合_配置式开发
  • 原文地址:https://www.cnblogs.com/PeriHe/p/8718659.html
Copyright © 2011-2022 走看看