前言
- 在编程中去重还是很常见的
- 最近被一个朋友发来的需求蒙住了,花了很多时间查阅思考解决
- 可能是我本来实力不强吧
- js去重有好几个方法我之前记录过了,这篇只是记录这两个新的案例
- 如果要看的可以去点击 标签->Js笔记->Js回顾 温故知新 可以为师矣
工具/资料
- 系统 Mac Os 10.13.3
- 工具 vs code
- 资料借阅网上的一篇去重案例改成需求
开始
1. 数组对象中判断出现重复的子项都清空(重复的子项也清除不保留)
案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17var arr = [{
"name": "ZYTX",
"age": "Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix",
"gender": "AAAAAA.doc"
}, {
"name": "ZYTA",
"age": "Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix",
"gender": "BBBBBB.doc"
}, {
"name": "ZDTX",
"age": "Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix",
"gender": "CCCCCC.doc"
}, {
"name": "ZYTX",
"age": "Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix",
"gender": "AAAAAA.doc"
}];需求效果 (重复的都清空)
1
2
3
4
5
6
7
8
9var arr = [{
"name": "ZYTA",
"age": "Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix",
"gender": "BBBBBB.doc"
}, {
"name": "ZDTX",
"age": "Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix",
"gender": "CCCCCC.doc"
};解决思路
- 先去重复,记录重复子项
- 提取非重复项输出
编码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38var arr = [{
"name": "ZYTX",
"age": "Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix",
"gender": "AAAAAA.doc"
}, {
"name": "ZYTA",
"age": "Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix",
"gender": "BBBBBB.doc"
}, {
"name": "ZDTX",
"age": "Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix",
"gender": "CCCCCC.doc"
}, {
"name": "ZYTX",
"age": "Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix",
"gender": "AAAAAA.doc"
}, {
"name": "ZYTX",
"age": "Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix",
"gender": "AAAAAA.doc"
}];
var hash = {}; // 记载以出现项
var min = {}; // 记载重复项
// 1. 去重记载(如果单一的去重第二步就不用做了)
arr = arr.reduce(function (item, next) {
hash[next.name] ? min[next.name] = true : hash[next.name] = true && item.push(next);
return item
}, [])
// 2. 再次去重(清除之前去重留下的重复项)
arr = arr.reduce(function (item, next) {
min[next.name] ? '' : min[next.name] = true && item.push(next);
return item
}, [])
console.log(arr);运行查看效果
1
2
3
4
5
6
7
8[ { name: 'ZYTA',
age:
'Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix',
gender: 'BBBBBB.doc' },
{ name: 'ZDTX',
age:
'Y13xG_4wQnOWK1QwJLgg11d0pS4hewePU95UHtpMl3eE81uS74NC-6zu-Rtnw4Ix',
gender: 'CCCCCC.doc' } ]
2. 数组对象中判断相同id中的某一项去重
案例
1
var arr = [{ id: 1, type: '倒2', name: '广东' }, { id: 1, type: '倒1', name: '广东' }, { id: 1, type: '倒2', name: '广东' }, { id: 1, type: '倒1', name: '广东' }, { id: 2, type: '倒1', name: '广东' }, { id: 2, type: '倒2', name: '广东' }, { id: 2, type: '倒2', name: '广东' }, { id: 2, type: '倒5', name: '广东' }];
需求效果 (保留单一重复项)
1
2
3
4
5[ { id: 1, type: '倒2', name: '广东' },
{ id: 1, type: '倒1', name: '广东' },
{ id: 2, type: '倒1', name: '广东' },
{ id: 2, type: '倒2', name: '广东' },
{ id: 2, type: '倒5', name: '广东' } ]解决思路
- 提取id,与type子项
- 这里用了一个小技巧在重复子项上面加上id这样就好判断很多了
编码
1
2
3
4
5
6
7
8
9
10var hash = {};
var min = {};
arr = arr.reduce(function (item, next) {
// 记录当id为true 和 子项+id相同才为真
// 这里+id主要是为了好判断
hash[next.id] && hash[next.type + next.id] == next.type ? "" : (hash[next.id] = true) && (hash[next.type+next.id] = next.type) && item.push(next);
return item
}, [])
console.log(arr);运行查看效果
1
2
3
4
5[ { id: 1, type: '倒2', name: '广东' },
{ id: 1, type: '倒1', name: '广东' },
{ id: 2, type: '倒1', name: '广东' },
{ id: 2, type: '倒2', name: '广东' },
{ id: 2, type: '倒5', name: '广东' } ]
后记
- 记录两个去重小案例,吐槽一下这个老哥1w工资真的不知道着么骗回来的,欢迎更多的同行大哥指导交流
- 欢迎进入我的博客:https://yhf7.github.io/
- 如果有什么侵权的话,请及时添加小编微信以及qq也可以来告诉小编(905477376微信qq通用),谢谢!