likes
comments
collection
share

JS应用:多数组中找到两次及以上的元素

作者站长头像
站长
· 阅读数 2

前言

如何在多个数组中找到出现两次及以上的元素,并把这些元素作为一个数组输出。若为不存在,则输出空数组[]

例如: 数组 [1,2,3] [1,4,2,1] => [1,2] 数组 [1,2,3] [4,5,6,7] => []

实现思想1

1. 将多个数组元素拼接成一个数组

使用 Array.concat() 将多个数组拼接成一个数组

var arr1 = [123]
var arr2 = [1421]
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 = [123]
var arr2 = [1421]
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)

JS应用:多数组中找到两次及以上的元素

实现方法2

filter()实现方法中,实现相同逻辑,但使用两种不同的书写方式。

// 假定数组元素
var arr1 = [123]
var arr2 = [1421]
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() 认为二者不同,两个都保留到结果中。