zoukankan      html  css  js  c++  java
  • 数组去重

    去重是开发中经常会碰到的一个热点问题,不过目前项目中碰到的情况都是后台接口使用SQL去重,简单高效,基本不会让前端处理去重。
    当然,这并不是说前端去重就没有必要了,依然需要会熟练使用。先在就主要介绍几种常见的数组去重的方法。

    1. 双循环去重

    双重for(或while)循环是比较笨的方法,它实现的原理很简单:先定义一个包含原始数组第一个元素的数组,然后遍历原始数组,将原始数组中的每个元素与新数组中的每个元素进行比对,如果不重复则添加到新数组中,最后返回新数组;因为它的时间复杂度是O(n^2),如果数组长度很大,那么将会非常耗费内存。

    function unique(arr) {
        if (!Array.isArray(arr)) {
            console.log('type error!')
            return
        }
        let res = [arr[0]]
        for (let i = 1; i < arr.length; i++) {
            let flag = true
            for (let j = 0; j < res.length; j++) {
                if (arr[i] === res[j]) {
                    flag = false;
                    break
                }
            }
            if (flag) {
                res.push(arr[i])
            }
        }
        return res
    }

    2. indexOf方法去重

    数组的indexOf()方法可返回某个指定的元素在数组中首次出现的位置。该方法首先定义一个空数组res,然后调用indexOf方法对原来的数组进行遍历判断,如果元素不在res中,则将其push进res中,最后将res返回即可获得去重的数组.

    var array = [1,5,2,3,4,2,3,1,3,4]
    function unique(array){
     let  arr = [ ]
     for(let i=0;i< array.length;i++){
         if (arr.indexOf(array[i]) === -1){
             arr.push(array[i])
         }
     }
     return arr
    }
    利用indexOf检测元素在数组中第一次出现的位置是否和元素现在的位置相等,如果不等则说明该元素是重复元素.
    
    function unique(arr) {
        if (!Array.isArray(arr)) {
            console.log('type error!')
            return
        }
        return Array.prototype.filter.call(arr, function(item, index){
            return arr.indexOf(item) === index;
        });
    }

    3. 相邻元素去重

    这种方法首先调用了数组的排序方法sort(),然后根据排序后的结果进行遍历及相邻元素比对,如果相等则跳过改元素,直到遍历结束.

    function unique(arr) {
        if (!Array.isArray(arr)) {
            console.log('type error!')
            return
        }
        arr = arr.sort()
        let res = [arr[0]]
        for (let i = 1; i < arr.length; i++) {
            if (arr[i] !== arr[i-1]) {
                res.push(arr[i])
            }
        }
        return res
    }

    4. 利用对象属性去重

    创建空对象,遍历数组,将数组中的值设为对象的属性,并给该属性赋初始值1,每出现一次,对应的属性值增加1,这样,属性值对应的就是该元素出现的次数了.

    //注意:在 JavaScript 里,对象的键值只能是字符串,
    //因此需要 var key = typeof(item) + item 来区分数值 1 和字符串 '1' 等情况。
    function unique(arr) {
    var ret = [];
    var hash = {};
    for (var i = 0; i < arr.length; i++) {
    var item = arr[i];
    var key = typeof(item) + item;
    if (hash[key] !== 1) {
    ret.push(item);
    hash[key] = 1;
    }
    }
    
    return ret;
    }
    let arr=[1,1,2,2,'1','1','11',NaN,NaN,,,];
    console.log(unique(arr));

    5. set与解构赋值去重

    ES6中新增了数据类型set,set的一个最大的特点就是数据不重复。Set函数可以接受一个数组(或类数组对象)作为参数来初始化,利用该特性也能做到给数组去重..
    Array.from方法可以将Set结构转换为数组结果,而我们知道set结果是不重复的数据集,因此能够达到去重的目的.

    array = [1,5,2,3,4,2,3,1,3,4]
    function unique(array){
    // return [...new Set(arr)]
    return Array.from(new Set(array)); 
    }
    
    console.log(unique(array));
     
  • 相关阅读:
    C++中整型变量的存储大小和范围
    A1038 Recover the Smallest Number (30 分)
    A1067 Sort with Swap(0, i) (25 分)
    A1037 Magic Coupon (25 分)
    A1033 To Fill or Not to Fill (25 分)
    A1070 Mooncake (25 分)
    js 获取控件
    C#代码对SQL数据库添加表或者视图
    JS 动态操作表格
    jQuery取得下拉框选择的文本与值
  • 原文地址:https://www.cnblogs.com/gitnull/p/9532150.html
Copyright © 2011-2022 走看看