数据去重,笔试题系列
2023-02-18 16:37:49 时间
今天分享一道面试手写笔试题,主要考察数据去重问题
原题是这样的,给出一组数据,去掉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
相同的 - 通过
reduce
与Set
,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技术学苑,好好学习,天天向上!
相关文章
- 个人笔记(路由、网络相关)
- 个人笔记(vue篇)
- 怎么去水印不伤原图?这个去水印方法值得收藏!
- 羊了个羊,通关秘籍!
- 实用 | 盘点抓包修改响应结果的 2 种方式!
- 小技巧 | Chrome 插件如何完成剪切板的操作!
- DDOS攻击讲堂
- 思科交换机简单配置
- 实战 | 如何利用 Scrapy 编写一个完整的爬虫!
- 超简单就可做一款三功能的LED车灯
- 实战 | 教你快速爬取热门股票,辅助量化交易!
- 行业趋势|光伏行业SCM供应链数字化管理优势、价值
- 破除上下游梗阻,如何为能源化工行业开出“新良方”?
- 软件分享 | 第一期 Markdown神器Typora安装和破解教程
- jira-dev-tool插件安装失败的解决方法
- 软件分享 | 第二期 截图神器snipaste安装和使用教程
- 基于Hexo搭建静态博客
- 软件分享 | 第三期 搜索神器listary安装和使用
- 发送HTML模板邮件
- 使用3-hexo主题时无法正常渲染html代码