Tetegw
4/8/2018 - 2:59 AM

数组去重

数组去重多种方法

var arr = [0, 0, 0, 0, 6, 8, 7, 9, 8, 1, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 12, 14, 11, 14, 13, 16, 15, 15, 12, 10, 12, 14, 11, 14, 13, 16, 15, 15, 12, 12, 1, 3, 18];
//周亮的去重
// 冒泡排序
function Sort(arr) {
    var len = arr.length;
    for (var i = 0; i < len; i++) {
        for (var j = 0; j < len - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                var n = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = n;
            }
        }
    }
    return arr;
}
// 第一种 速度最慢!
function uniqueIndexOf(arr) {
    arr = Sort(arr); // 可有可无的一步骤
    var ret = [],
        len = arr.length; //定义新数组
    for (var i = 0; i < len; i++) {
        var n = arr[i];
        if (ret.indexOf(n) == -1) { // 通过内置函数indexOf的特性,当新数组中不存在 n 时,将n添加到新数组中。
            ret.push(n)
        }
    }
    return ret;
}
// 第二种 速度最快,但内存中多一个hash表
function uniqueHash(arr) {
    arr = Sort(arr); // 可有可无的一步骤
    var ret = [],
        hash = {},
        len = arr.length; //定义一个
    for (var i = 0; i < len; i++) {
        var n = arr[i];
        if (!hash[n]) { 
          // 利用 对象{} 的特性,遍历时获取对象hash的属性n是否存在,如果不存在,将n添加到新数组中。并给对象的属性n 赋值;
            ret.push(n);
            // hash[n] = n; //有bug 当n=0时,hash[n] = 0 ; 0 转换类型是false ,!0 为true。
            hash[n] = 1 // 优化后
        }
    }
    // return hash;
    return ret;
}
// 第三种 速度一般,比第一种快,比第二种慢3倍时间。
function uniqueSort(arr) {
    arr = Sort(arr);
    var ret = [arr[0]],
        len = arr.length;

    /**
     * [0,1,1,2,2,3,3,4,5,6,7,8,8,9,10,11,11] //排序后的数组
     * [0] //新数组
     * 原理,与冒泡排序类似,将排序后的旧数组 ,前一个数与后一个数比较是否相等,如果相等,跳过当前,执行下一个循环,如果不想等,将后一个数添加到新数组中。
     */
    // for(var i = 0 ; i < len-1 ; i++){ //有bug;
    for (var i = 0; i < len - 1; i++) { //优化后
        if (arr[i] !== arr[i + 1]) {
            // var n = arr[i]; // 有bug ;
            var n = arr[i + 1]; //优化后
            ret.push(n); // ret[ret.length] = n ;
        }
    }
    return ret;
}
console.log(uniqueIndexOf(arr));
console.log(uniqueHash(arr));
console.log(uniqueSort(arr));