JS应用:多数组中找到两次及以上的元素
前言
如何在多个数组中找到出现两次及以上的元素,并把这些元素作为一个数组输出。若为不存在,则输出空数组[]
例如:
数组 [1,2,3] [1,4,2,1] => [1,2]
数组 [1,2,3] [4,5,6,7] => []
实现思想1
1. 将多个数组元素拼接成一个数组
使用 Array.concat() 将多个数组拼接成一个数组
var arr1 = [1, 2, 3]
var arr2 = [1, 4, 2, 1]
var tempArr = arr1.concat(arr2)
2. 使用集合new Set()
使用集合set = new Set()统计,通过set.has()判断集合中是否有元素;set.add()添加元素到集合。
var set = new Set()
3. 设置新数组
通过集合has()判断要是集合含有待添加add()的元素,就将该元素push()到新的数组中(即该元素之前出现过)。
若新数组中push()的元素中也包含下次待添加的元素,则通过数组indexOf()来判断待添加元素是否存在与新数组中,若存在则返回元素下标,不存在则返回-1
var newArr = []
实现方法1
// 假定数组元素并处理
var arr1 = [1, 2, 3]
var arr2 = [1, 4, 2, 1]
var set = new Set()
var newArr = []
var tempArr = arr1.concat(arr2)
function searchEle() {
for (let i = 0; i < tempArr.length; i++) {
if (!set.has(tempArr[i])) {
set.add(tempArr[i])
} else if (newArr.indexOf(tempArr[i]) === -1) {
newArr.push(tempArr[i])
}
}
console.log(newArr)
}
searchEle()
[ 1, 2 ]
实现思想2
使用数组 filter() 函数
使用数组filter()函数,会新建一个数组,新数组元素通过检查指定数组中符合条件的所有元素(即方法中实现,需要 return )
语法:
array.filter(function(currentValue,index,arr), thisValue)
实现方法2
在filter()实现方法中,实现相同逻辑,但使用两种不同的书写方式。
// 假定数组元素
var arr1 = [1, 2, 3]
var arr2 = [1, 4, 2, 1]
var set = new Set()
var tempArr = arr1.concat(arr2)
1. 将 filter 执行函数单独拿出来定义
1.1 两种不同书写方式
// 1. function普通调用函数
const detect = () => {
return function(e){
return set.has(e) || !set.add(e)
}
}
// 2. ()=>箭头调用函数
const detect = () => {
return e => set.has(e) || !set.add(e)
}
解释一下 return 返回的情况:
return 会返回一个函数,其中包括两个操作即:
1. set.has(e)不包含元素返回false, 执行set.add(e)添加元素
2. set.has(e)包含元素直接返回true , 不执行set.add(e)添加元素
// 与实现方法1中实现相似
if (!set.has(tempArr[i])) {
set.add(tempArr[i])
}
PS:
set.has(e)返回值为boolean(true or false)
set.add(e)返回Set集合
其中加上! !set.add(e) 表示始终返回false
1.2 filter() 调用执行函数 detect()
// Array.filter调用detect函数
const arr = tempArr.filter(detect())
// 使用new Set()集合本身去重作用对arr数组去重
console.log(Array.from(new Set(arr)))
[ 1, 2 ]
2. 直接定义 filter 执行函数 (简洁)
const arr = tempArr.filter(function(e){
return set.has(e) || !set.add(e)
})
// 使用new Set()集合去重
console.log(Array.from(new Set(arr)))
[ 1, 2 ]
最后
简单介绍下new Set()集合去重
new Set() 函数具有去重作用,且去重原理如下
new Set()函数中会先调用对象的__hash__()方法,获取hash结果; 如果hash结果相同,用比较操作符==(也就是调用函数__eq__())判断二者的值是否相等; 如果都相等,去重;否则,set()认为二者不同,两个都保留到结果中。
转载自:https://juejin.cn/post/7005854154195222559
