数据去重,笔试题系列

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

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


原题是这样的,给出一组数据,去掉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]





相关文章
|
前端开发 Java 文件存储
JAVA 文件上传 和 下载
文件上传,也称为upload,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。
|
弹性计算 资源调度 Kubernetes
Flink三种集群模式,Standalone模式,Flink On YARN,Flink On K8S,这三种模式有啥优缺点,生产环境如何选择呢?
Flink三种集群模式,Standalone模式,Flink On YARN,Flink On K8S,这三种模式有啥优缺点,生产环境如何选择呢?
1668 3
|
资源调度 分布式计算 监控
|
消息中间件 设计模式 SQL
从Lambda架构到Kappa架构再到?浅谈未来数仓架构设计~
Linked大佬Jay Kreps曾发表过一篇博客,简单阐述了他对数据仓库架构设计的一些想法。从Lambda架构的缺点到提出基于实时数据流的Kappa架构。本文将在Kappa架构基础上,进一步谈数仓架构设计。 现代实时数仓和重要性已经越来越高,离线数仓积累的历史数据又很难被抛弃。采用新型的数仓架构,融合实时数仓和离线数仓的优点是一个值得讨论的话题。本文结合ECS的设计模式,探讨了如何设计了一套全新的混合数仓架构。
17563 0
|
存储 消息中间件 安全
计算与存储分离实践—swift消息系统
swift是搜索事业部自主研发分布式消息系统,它的主要存储基于分布式文件系统,资源需求基于分布式调度系统。swift能支持每秒数亿的消息传递,支持PB级消息的存储。
6410 0
|
存储 SQL Cloud Native
Hologres 的架构设计与工作原理
【9月更文第1天】随着大数据时代的到来,实时分析和处理数据的需求日益增长。传统的数据仓库在处理大规模实时数据分析时逐渐显露出性能瓶颈。为了解决这些问题,阿里巴巴集团研发了一款名为 Hologres 的新型云原生交互式分析数据库。Hologres 能够支持 SQL 查询,并且能够实现实时的数据写入和查询,这使得它成为处理大规模实时数据的理想选择。
469 2
|
SQL 消息中间件 OLAP
OneSQL OLAP实践问题之实时数仓中数据的分层如何解决
OneSQL OLAP实践问题之实时数仓中数据的分层如何解决
172 1
|
DataWorks 安全 数据库
DataWorks产品使用合集之简单模式下,如何实现数仓分层
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
190 3
|
JSON 数据格式
《QT从基础到进阶·三十三》QT插件开发QtPlugin
《QT从基础到进阶·三十三》QT插件开发QtPlugin
524 0