JavaScript 数组去重的几种写法

534 阅读1分钟

一、原始类型

1.利用ES6的新增数据结构Set

let arr = [1,2,2,2,3,4,4,3,5,5];  
arr = Array.from(new Set(arr));

写成函数:

function removeDuplicate(arr){
    return [...new Set(arr)];
}

2.利用Array.prototype.includes()

let arr = [1,2,2,2,3,4,4,3,5,5], newArr=[];
arr.forEach(item => {
    if(!newArr.includes(item)){
        newArr.push(item);
    }
})

3.利用Array.prototype.indexOf()

let arr = [1,2,2,2,3,4,4,3,5,5], newArr=[];
arr.forEach(item => {
    if(newArr.indexOf(item) === -1){
        newArr.push(item);
    }
})

二、引用类型——对象

业务开发中遇到的问题:添加课程安排需要用到课程信息,但课程信息不能从 课程表中直接获取,只能先拿到课程安排,再从课程安排中取出课程信息供添加、修改课程安排时使用。从课程安排中取出的课程如下。

    courses = [
        {
            CourseID:1,
            CourseName:'英语课'
        },
        {
            CourseID:2,
            CourseName:'英语课'
        },
        {
            CourseID:3,
            CourseName:'数学课'
        },
        {
            CourseID:4,
            CourseName:'英语课'
        },
        {
            CourseID:5,
            CourseName:'语文课'
        },
    ]

方法1:使用 Set + Array.from + JSON.stringify + JSON.parse

let courses = courseArrangment.map(item => {
    return JSON.stringify({
        CourseID: item.CourseID,
        CourseName: item.CourseName
    });
});
courses = Array.from(new Set(courses));
courses = courses.map(item => {
    return JSON.parse(item);
});

先用courseArrangment.map()从课程安排取出课程,由于直接使用Set不能去掉重复的课程,所以使用JSON.stringify()将课程转成JSON字符串,再利用Set则可去掉重复的课程,最后用JSON.parse()把课程转成JSON对象。

方法2:使用 Array的 filter + findIndex 实现

let courses = courseArrangment.map(item => ({
          CourseID: item.CourseID,
          CourseName: item.CourseName
        })).filter((item, index, self) => {
          return self.findIndex(i => item.CourseID === i.CourseID) === index;
        });

先用courseArrangment.map()从课程安排取出课程,再使用filter()去掉重复的课程。