1 - 数组若干方法去重

114 阅读3分钟

es6 - new Set()去重--最简洁的方式

/**
 * new Set()里面的值是唯一的
 * 把类数组变成数组的方法: Array.from()
 */
function uniqueArr10(array) {
    return Array.from(new Set(array));
}
console.log(uniqueArr10(arr)); // [0, 1, 2, 3, 4, 5, 7, 8, 9]

1. 双for循环去重

var arr = [1, 1, 2, 3, 8, 8, 5, 2, 5, 0, 1, 7, 5, 8, 7, 9, 4, 8, 4, 0];
function uniqueArr(array) {
    var _arr = [],
        isRepeat; // 锁,判断数组元素是否重复的状态
    for (var i = 0; i < array.length; i++) {
        isRepeat = false;
        for (var j = 0; j < _arr.length; j++) {
            if (array[i] == _arr[j]) {
                isRepeat = true;
                break;
            }
        }
        if (!isRepeat) {
            _arr.push(array[i]);
        }
    }
    return _arr;
}
console.log(uniqueArr(arr).sort()) // [0, 1, 2, 3, 4, 5, 7, 8, 9]

2. 双for循环去重 (这个双for循环比1的效率低)

/**
 * 2. 双for循环去重 (这个双for循环比1的效率低)
 * 思路:遍历的时候,将数组的前一个元素跟数组的下一个元素做对比,
 *       如果重复就跳过,不重复就加入新数组
 */
var arr = [1, 1, 2, 3, 8, 8, 5, 2, 5, 0, 1, 7, 5, 8, 7, 9, 4, 8, 4, 0];
function uniqueArr2(array) {
    var _arr = [],
        isRepeat; // 锁,判断数组元素是否重复的状态
    for (var i = 0; i < array.length; i++) {
        isRepeat = false;
        for (var j = i + 1; j < array.length; j++) {
            if (array[i] == array[j]) {
                isRepeat = true;
                break;
            }
        }
        if (!isRepeat) {
            _arr.push(array[i]);
        }
    }
    return _arr;
}
console.log(uniqueArr2(arr).sort()) // [0, 1, 2, 3, 4, 5, 7, 8, 9]

3. filter去重

/**
 * 3. filter去重
 * indexOf返回元素在数组中第一次出现的下标,没有就返回-1
 */
var arr = [1, 1, 2, 3, 8, 8, 5, 2, 5, 0, 1, 7, 5, 8, 7, 9, 4, 8, 4, 0];
function uniqueArr3(array) {
    return array.filter(function (item, index) {
        return array.indexOf(item) === index;
    })
}
console.log(uniqueArr3(arr).sort()); // [0, 1, 2, 3, 4, 5, 7, 8, 9]

4. forEach去重

var arr = [1, 1, 2, 3, 8, 8, 5, 2, 5, 0, 1, 7, 5, 8, 7, 9, 4, 8, 4, 0];
function uniqueArr4(array) {
    var _arr = [];
    array.forEach(function (item) {
        //判断新数组中是否含有遍历的元素,没有就添加到新数组_arr中
        if (_arr.indexOf(item) === -1) {
            _arr.push(item);
        }
    })
    return _arr;
}
console.log(uniqueArr4(arr).sort()); // [0, 1, 2, 3, 4, 5, 7, 8, 9]

5. sort()+for循环去重

var arr = [1, 1, 2, 3, 8, 8, 5, 2, 5, 0, 1, 7, 5, 8, 7, 9, 4, 8, 4, 0];
function uniqueArr5(array) {
    var _arr = [];
    array.sort(); // [0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 5, 5, 5, 7, 7, 8, 8, 8, 8, 9]
    for (var i = 0; i < array.length; i++) {
        //方法1:
        if (array[i] !== _arr[_arr.length - 1]) {
            _arr.push(array[i]);
        }
        //方法2:
        if (array[i] !== array[i + 1]) {
            _arr.push(array[i]);
        }
    }
    return _arr;
}
console.log(uniqueArr5(arr)); // [0, 1, 2, 3, 4, 5, 7, 8, 9]

6. es6 - includes()去重

/**
 * indexOf和includes的区别:
 * array.indexOf(item): 存在就返回对应的item的下标,不存在就返回-1;item为NaN则无效
 * array.includes(item):存在就返回true,不存在则返回false
 */
var arr = [1, 1, 2, 3, 8, 8, 5, 2, 5, 0, 1, 7, 5, 8, 7, 9, 4, 8, 4, 0];
function uniqueArr6(array) {
    var _arr = [];
    array.forEach(function (item) {
        //如果_arr中不包含遍历的元素item,则往_arr中添加
        if (!_arr.includes(item)) {
            _arr.push(item);
        }
    })
    return _arr;
}
console.log(uniqueArr6(arr).sort()); // [0, 1, 2, 3, 4, 5, 7, 8, 9]

7. es6 - reduce()去重

var arr = [1, 1, 2, 3, 8, 8, 5, 2, 5, 0, 1, 7, 5, 8, 7, 9, 4, 8, 4, 0];
function uniqueArr7(array) {
    var _arr = [];
    return array.sort().reduce(function (prev, item) {
        /**
         * array.sort():[0, 0, 1, 1, 1,..., 9]
         * prev的初始值是[]
         * 判断prev是否为空,为空则添加;
         * 判断prev数组的最后一项跟当前遍历项对比,不同则证明不重复,添加
         */
        if (prev.length === 0 || prev[prev.length - 1] !== item) {
            prev.push(item);
        }
        return prev;
    }, [])
}
console.log(uniqueArr7(arr)); // [0, 1, 2, 3, 4, 5, 7, 8, 9]

8. es6 - new Map()去重

var arr = [1, 1, 2, 3, 8, 8, 5, 2, 5, 0, 1, 7, 5, 8, 7, 9, 4, 8, 4, 0];
function uniqueArr8(array) {
    var _arr = [],
        _temp = new Map();
    for (var i = 0; i < array.length; i++) {
        /**
         * new Map().get():返回映射中的指定元素
         * new Map().set(元素,键值):添加新元素到映射中
         */
        if (!_temp.get(array[i])) {
            _temp.set(array[i], 1);
            _arr.push(array[i]);
        }
    }
    return _arr;
}
console.log(uniqueArr8(arr).sort()); // [0, 1, 2, 3, 4, 5, 7, 8, 9]

9. {},利用对象的键名不重复特性去重

var arr = [1, 1, 2, 3, 8, 8, 5, 2, 5, 0, 1, 7, 5, 8, 7, 9, 4, 8, 4, 0];
function uniqueArr9(array) {
    var _arr = [],
        _temp = {};
    for (var i = 0; i < array.length; i++) {
        // 判断对象_temp是否存在键名array[i]
        if (!_temp[array[i]]) {
            _temp[array[i]] = 1; // 设置对象_temp里array[i]键值的为1
            _arr.push(array[i]);
        }
    }
    return _arr;
}
console.log(uniqueArr9(arr).sort()); // [0, 1, 2, 3, 4, 5, 7, 8, 9]