算法-去重

23 阅读1分钟

几种去重方式

'1' == new String('1')
'1' !== new String('1')
null == null
null === null
undefined == undefined
undefined === undefined
NaN != NaN
NaN !== NaN
/a/ != /a/
/a/ !== /a/
{} != {}
{} !== {}

var array = [1, 1, '1', '1', null, null, undefined, undefined, new String('1'), new String('1'), /a/, /a/, NaN, NaN];

一、for双重循环

进行===判断

function unique(array) {
    // res用来存储结果
    var res = [];
    for (var i = 0, arrayLen = array.length; i < arrayLen; i++) {
        for (var j = 0, resLen = res.length; j < resLen; j++ ) {
            if (array[i] === res[j]) {
                break;
            }
        }
        // 如果array[i]是唯一的,那么执行完循环,j等于resLen
        if (j === resLen) {
            res.push(array[i])
        }
    }
    return res;
}
=> [1, '1', null, undefined, String, String, /a/, /a/, NaN, NaN]

二、indexOf

indexOf 底层还是使用 === 进行判断

function unique(array) {
    var res = [];
    for (var i = 0, len = array.length; i < len; i++) {
        var current = array[i];
        if (res.indexOf(current) === -1) {
            res.push(current)
        }
    }
    return res;
}
=> [1, '1', null, undefined, String, String, /a/, /a/, NaN, NaN]

三、sort排序后去重

进行===判断

function unique(array) {
    var res = [];
    var sortedArray = array.concat().sort();
    var seen;
    for (var i = 0, len = sortedArray.length; i < len; i++) {
        // 如果是第一个元素或者相邻的元素不相同
        if (!i || seen !== sortedArray[i]) {
            res.push(sortedArray[i])
        }
        seen = sortedArray[i];
    }
    return res;
}
=> [/a/, /a/, 1, '1', String, String, NaN, NaN, null, undefined]

四、filter+indexOf

function unique(array) {
    var res = array.filter(function(item, index, array){
        return array.indexOf(item) === index;
    })
    return res;
}
=> [1, '1', null, undefined, String, String, /a/, /a/]

五、sort+filter

function unique(array) {
    return array.concat().sort().filter(function(item, index, array){
        return !index || item !== array[index - 1]
    })
}
=> [/a/, /a/, 1, '1', String, String, NaN, NaN, null, undefined]

六、Object键值对

function unique(array) {
    var obj = {};
    return array.filter(function(item, index, array){
    return obj.hasOwnProperty(typeof item + JSON.stringify(item)) ? false : (obj[typeof item + JSON.stringify(item)] = true)
    })
}
=> [1, '1', null, undefined, String, /a/, NaN]

七、Set

Set 认为尽管 NaN === NaN 为 false,但是这两个元素是重复的

var unique = (a) => [...new Set(a)]
=>  [1, '1', null, undefined, String, String, /a/, /a/, NaN]

八、Map

function unique (arr) {
    const seen = new Map()
    return arr.filter((a) => !seen.has(a) && seen.set(a, 1))
}
=> [1, '1', null, undefined, String, String, /a/, /a/, NaN]