JS算法-数组去重

137 阅读1分钟

本文介绍了八点数组去重方法。

一、利用ES6 Set去重(ES6中最常用)

// 方法一:
function unique(arr) {
    return Array.from([...new Set(arr)]);
}

// 方法二:
function unique(arr) {
  return [...new Set(arr)]
}

var arr = [
    'true', 'true', 
    true, true, 
    undefined, undefined, 
    null, null, 
    NaN, NaN, 
    0, 0, 
    'a', 'a', 
    {}, {}
];
console.log(unique(arr)); 
// ["true", true, undefined, null, NaN, 0, "a", {}, {}]

二、利用Map数据结构去重

// 方法一:
function unique(arr) {
    const newArray = [];
    const tmp = new Map();
    for(let i = 0; i < arr.length; i++) {
        if (!tmp.has(arr[i])) {
            tmp.set(arr[i], 1)
            newArray.push(arr[i])
        }
    }
    return newArray;
}
// 方法二:
function unique(arr) {
    const tmp = new Map();
    return arr.filter(item => !tmp.has(item) && tmp.set(item, 1));
}
var arr = [
    'true', 'true', 
    true, true, 
    undefined, undefined, 
    null, null, 
    NaN, NaN, 
    0, 0, 
    'a', 'a', 
    {}, {}
];
console.log(unique(arr));
// ["true", true, undefined, null, NaN, 0, "a", {}, {}]
// {}没有去重

三、利用for嵌套for,然后splice去重(ES5中最常用)

function unique(arr){            
    for(let i = 0; i < arr.length; i++){
        for(let j = i+1; j < arr.length; j++){
            if(arr[i] == arr[j]) { // 找到两个相同的元素,删除一个
                arr.splice(j,1);
                j--;
            }
        }
    }
    return arr;
}
var arr = [
    'true', 'true', 
    true, true, 
    undefined, undefined, 
    null, null, 
    NaN, NaN, 
    0, 0, 
    'a', 'a', 
    {}, {}
];
console.log(unique(arr)); 
// ["true", true, undefined, NaN, NaN, 0, "a", {}, {}]  
// NaN和{}没有去重,因为null和undefined相同,null被删掉了

四、利用indexOf去重

function unique(arr) {
    const resArr = [];
    for (let i = 0; i < arr.length; i++) {
        if (resArr.indexOf(arr[i]) === -1) {
            resArr.push(arr[i])
        }
    }
    return resArr;
}
var arr = [
    'true', 'true', 
    true, true, 
    undefined, undefined, 
    null, null, 
    NaN, NaN, 
    0, 0, 
    'a', 'a', 
    {}, {}
];
console.log(unique(arr));
// ["true", true, undefined, null, NaN, NaN, 0, "a", {}, {}]
// NaN、{}没有去重

五、利用sort

function unique(arr) {
    let newArr = arr.sort();
    let array = [newArr[0]];
    for (let i = 1; i < newArr.length; i++) {
        if (newArr[i] !== newArr[i-1]) {
            array.push(newArr[i]);
        }
    }
    return array;
}
var arr = [
    'true', 'true', 
    true, true, 
    undefined, undefined, 
    null, null, 
    NaN, NaN, 
    0, 0, 
    'a', 'a', 
    {}, {}
];
console.log(unique(arr));
// ["true", true, undefined, null, NaN, NaN, 0, "a", {}, {}]
// NaN、{}没有去重

六、利用对象属性唯一性

function unique(arr) {
    let array = [];
    let obj = {};
    for (let i = 0; i < arr.length; i++) {
        if (!obj[arr[i]]) { // 无法过滤掉arr[i]为true
            arrry.push(arr[i]);
            obj[arr[i]] = 1;
        } else {
            obj[arr[i]]++;
        }
    }
    return array;
}
var arr = [
    'true', 'true', 
    true, true, 
    undefined, undefined, 
    null, null, 
    NaN, NaN, 
    0, 0, 
    'a', 'a', 
    {}, {}
];
console.log(unique(arr));
// ["true", undefined, null, NaN, NaN, 0, "a", {}, {}]
// 两个true直接去掉了, NaN、{}没有去重

七、利用includes

function unique(arr) {
    const array = [];
    for(var i = 0; i < arr.length; i++) {
        //includes 检测数组是否有某个值
        if(!array.includes(arr[i])) {
            array.push(arr[i]);
        }
    }
    return array;
}
var arr = [
    'true', 'true', 
    true, true, 
    undefined, undefined, 
    null, null, 
    NaN, NaN, 
    0, 0, 
    'a', 'a', 
    {}, {}
];
console.log(unique(arr));
// ["true", true, undefined, null, NaN, 0, "a", {}, {}]
// {}没有去重

八、利用reduce+includes

function unique(arr){
    return arr.reduce((prev,cur) => prev.includes(cur) 
        ? prev : [...prev,cur], []);
}
var arr = [
    'true', 'true', 
    true, true, 
    undefined, undefined, 
    null, null, 
    NaN, NaN, 
    0, 0, 
    'a', 'a', 
    {}, {}
];
console.log(unique(arr));
// ["true", true, undefined, null, NaN, 0, "a", {}, {}]
// {}没有去重

总结

本文介绍了set,map,结合数组方法indexOf,includes,filter,sort等方法,以及双重for循环和对象属性的唯一性等特性来进行数组去重。相比之下,Set和Map数据结构处理去重性能比较好。

参考文章

JavaScript数组去重

解锁多种JavaScript数组去重姿势