过滤数两个数组中重复的元素
# 过滤两个数组中重复的元素
# 普通元素
var a = [1, 2, 3, 4, 5],
b = [ 1, 2, 3];
a.filter(i => b.indexOf(i) !== -1); // [4, 5]
1
2
3
2
3
# 对象元素
# reduce()+new Map()的方式
这里要注意一点,两个数组中的对象必须完全一样才可以检测
let arr1 = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }];
let arr2 = [{ id: 1 }, { id: 2 }, { id: 3 }];
let res = Object.assing(arr1); // 输出数组
const all = [...arr1, ...arr2].reduce((all, n) => {
n = JSON.stringify(n);
all.set(n, (all.get(n) || 0) + 1); // 标记重复的元素的数量
return all;
}, new Map());
// 找交集
for (const dataset of all) {
const [key, num] = dataset;
if (num > 1) { // num大于1代表该元素有重复
const { id } = JSON.parse(key) ?? 0;
res.splice(res.findIndex(item => item.id === id), 1)
}
}
console.log(res); // [{ id: 4 }, { id: 5 },]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 数组循环的方式
let arr3 = [{ code: 1, name: 'a' }, { code: 2, name: 'b' }, { code: 3, name: 'c' }],
arr4 = [{ code: 1, name: 'a' }, { code: 2, name: 'b' }, { code: 3, name: 'c' }, { code: 4, name: 'f' }, { code: 5, name: 'e' }],
newArr = deepClone(arr4);
arr4.map(item => {
let val = arr3.findIndex(i => item.code === i.code)
val !== -1 ? newArr[val]['repeat'] = true : '';
})
newArr = newArr.filter(i => !i.repeat);
console.log(newArr); // [{ code: 4, name: 'f' }, { code: 5, name: 'e' }]
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 优化版
上面两种方式有个共同的问题,arr1和arr2必须完全一样才可以(数组内的对象属性一样,数组元素顺序一样),否则无法查找。
下面这种方式,即使两个数组顺序不同也可进行查找。
let arr1 = [{ code: 1, name: 'a' }, { code: 3, name: 'c' }],
arr2 = [{ code: 1, name: 'a' }, { code: 2, name: 'b' }, { code: 3, name: 'c' }];
function getArrDifSameValue(arr1, arr2) {
var result = [];
for (var i = 0; i < arr2.length; i++) {
var obj = arr2[i];
var code = obj.code;
var isExist = false;
for (var j = 0; j < arr1.length; j++) {
var aj = arr1[j];
var n = aj.code;
if (n == code) {
isExist = true;
break;
}
}
if (!isExist) {
result.push(obj);
}
}
return result;
}
console.log(getArrDifSameValue(arr1, arr2)); // [{ code: 2, name: 'b' }]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
ES6再优化版
function getArrItems(arr1, arr2) {
let res = [];
arr2.forEach(item => {
let flag = arr1.find(ite => return item.code === ite.code );
if (!flag) {
res.push(item);
}
})
return res;
}
console.log(getArrItems(arr1, arr2));
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
在GitHub上编辑 (opens new window)
上次更新: 2/23/2022, 5:36:03 PM