JavaScript 数组去重

164 阅读1分钟
  • 导读
    • 数组去重是非常常见的题目,今天来试一下不同的方法实现数组去重。

一、使用for循环

  • 利用循环遍历数组,查询数组中每一个值是否存在于新数组中,如果不存在就将这个值push进新数组,最后返回这个新数组即可。
let array = [1, 5, 2, 3, 4, 2, 3, 1, 3, 4];

function unique(value) {
    const arrayCopy = value;
    let arrayNew = []; // 准备一个空数组
    for (let i = 0; i < arrayCopy.length; i++) {
        if (arrayNew.indexOf(arrayCopy[i]) === -1) {
        // indexOf查询数组中是否存在指定值,不存在则返回1
            arrayNew.push(arrayCopy[i]);
        } else {
            continue;
        }
    }
    return console.log(arrayNew);
}

unique(array);
  • 缺点:循环比较冗余,如果数据量大执行效率差

二、利用Set对象

  • Set 中的值总是唯一的

MDN定义:Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

let array = [1, 5, 2, 3, 4, 2, 3, 1, 3, 4];

function unique(value) {
    const arrayCopy = value;
    let newSet = new Set(arrayCopy); // 定义一个set对象,他的值是数组arrayCopy
    const arrayNew = Array.from(newSet); // 将set对象转化为数组
    return console.log(arrayNew);
}
unique(array);
  • 缺点:涉及到了类型转换,特定情况下并不稳定

三、利用Array.map()

  • 由于map函数本身的特性,数组中的每一项都会去执行函数,所以我觉得它更像是第一种方法的简化版
let array = [1, 5, 2, 3, 4, 2, 3, 1, 3, 4];

function unique(value) {
    let arrayCopy = value;
    let arrayNew = [];
    arrayCopy.map((i) => {
        if (arrayNew.indexOf(i) === -1) {
            arrayNew.push(i);
        }
    })
    return console.log(arrayNew);
}
unique(array);
  • 原理和for循环类似,可能会出现执行效率的问题