数据去重,笔试题系列

简介: 今天分享一道面试手写笔试题,主要考察数据去重问题

今天分享一道面试手写笔试题,主要考察数据去重问题


原题是这样的,给出一组数据,去掉id相同的数据并进行排序

const arr = [
    {id: 0,pid: 1,order: 2,},
    { id: 0,pid: 1,order: 2 },
    {id: 0, pid: 1,order: 3,},
    {id: 1,pid: 1,order: 3,},
    {id: 2,pid: 2,order: 5,},
    {id: 3,pid: 2,order: 4,}
];

过滤后的结果

[
  { id: 0, pid: 1, order: 2 },
  { id: 1, pid: 1, order: 3 },
  { id: 2, pid: 2, order: 5 },
  { id: 3, pid: 2, order: 4 }
]

方法一:主要是利用对象存储id为key,对象的key不会重复

const quchong = (arr) => {
    const ret = [], obj = {};
    arr.forEach(v => {
        // if (!obj[v.id]) {
        //     ret.push(v)
        // }
        /**
         * 与下面等价
         */
        if (!Reflect.has(obj, v.id)) {
            ret.push(v)
        }
        obj[v.id] = v.id;
    })
    return ret.sort((a, b) => a.id - b.id);
}

方法二:利用reduce结合findeIndex

const quchong2 = (arr) => {
    return arr.reduce((cur, prev) => {
        if (cur.findIndex(v => v.id === prev.id) === -1) {
            cur.push(prev)
        }
        return cur.sort((a, b) => a.id - b.id);
    }, [])
}


方法三: 通过Set去重对应的id,然后根据reduce计算方法,将原数组数据映射到对象中,然后返回对象的值

const quchong3 = (arr) => {
    const arrId = [...new Set(arr.map(v => v.id))];
    return arrId.reduce((cur, id) => {
        if (!cur[id]) {
            cur[id] = arr.find(v => v.id === id)
        }
        return Object.values(cur).sort((a, b) => a.id - b.id)
    }, {})
}

方法四: 利用Map对数据进行过滤

const quchong4 = (arr, map = new Map()) => {
    arr.forEach(v => {
        if (!map.has(v.id)) {
            map.set(v.id, v)
        }
    });
    return Object.values(map).sort((a, b) => a.id - b.id)
}
console.log('quchong1:', quchong(arr));
console.log('quchong2:', quchong2(arr));
console.log('quchong3:', quchong3(arr));
console.log('quchong4:', quchong4(arr));


总结


  • 主要考察数据过滤,我们利用对象key不重复,先判断对象中是否有key,向数组中添加数据,然后将当前的id作为对象的key,如果有就不向数组中添加数据
  • 我们也可以结合reduce这个计算方法,结合findIndex判断是否有id相同的
  • 通过reduceSet,Set过滤相同的id,然后进行计算循环,判断cur中是否有pid
  • 利用Map对原有数据进行去重,将没有的值,以id作为key,将当前项变成值,然后调用Object.values(map)返回其值即可。
  • 本文示例源码code example[1]





相关文章
|
3月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
25 0
|
5月前
|
搜索推荐 算法
【初阶数据结构篇】插入、希尔、选择、堆排序介绍(上篇)
堆排序(Heapsort)是指利⽤堆积树(堆)这种数据结构所设计的⼀种排序算法,它是选择排序的⼀ 种。它是通过堆来进⾏选择数据。需要注意的是排升序要建⼤堆,排降序建⼩堆。
23 0
|
7月前
|
存储 算法 大数据
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
|
8月前
|
存储 算法 Serverless
数据结构期末复习(六)查找算法
数据结构期末复习(六)查找算法
58 0
|
8月前
|
搜索推荐 算法 Shell
【数据结构】手撕排序(排序的概念及意义、直接插入和希尔排序的实现及分析)
【数据结构】手撕排序(排序的概念及意义、直接插入和希尔排序的实现及分析)
|
8月前
|
算法 索引
二分查找算法案例
二分查找算法案例
76 0
|
算法 搜索推荐
分治法实现合并排序(归并排序),理解分治算法思想,实现分治算法的完美例子合并排序(含码源与解析)
分治法实现合并排序(归并排序),理解分治算法思想,实现分治算法的完美例子合并排序(含码源与解析)
213 0
|
8月前
|
算法 搜索推荐 Java
算法编程(四):合并两个有序数组
算法编程(四):合并两个有序数组
78 0
【八大排序(四)】快排-到底多快才能追上奔驰车里的夏树?(下)
【八大排序(四)】快排-到底多快才能追上奔驰车里的夏树?(下)
【八大排序(四)】快排-到底多快才能追上奔驰车里的夏树?(下)
【八大排序(四)】快排-到底多快才能追上奔驰车里的夏树?(上)
【八大排序(四)】快排-到底多快才能追上奔驰车里的夏树?

热门文章

最新文章