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)); 
  • 相关阅读:
    6-Python爬虫-分布式爬虫/Redis
    ES 查询时 排序报错(fielddata is disabled on text fileds by default ... )解决方法
    Intellij Idea webstorm 激活
    Intellij Idea 配置jdk
    java 获取(格式化)日期格式
    js 跳转 XSS漏洞 预防
    CSS去掉背景颜色
    js对象无法当成参数传递 解决方法
    Elasticsearch java api
    java多条件查询SQL语句拼接的小技巧
  • 原文地址:https://www.cnblogs.com/PeriHe/p/8718659.html
Copyright © 2011-2022 走看看