前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据去重,笔试题系列

数据去重,笔试题系列

作者头像
Maic
发布2022-12-21 19:16:14
4940
发布2022-12-21 19:16:14
举报

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

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

参考资料

[1]code example: https://github.com/maicFir/lessonNote/blob/master/面试题/02-数据去重/index.js

最后,看完觉得有收获的,点个赞,在看,转发,收藏等于学会,欢迎关注Web技术学苑,好好学习,天天向上!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Web技术学苑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 总结
  • 参考资料
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档