数组交集/并集

今天用到处理数组交集的问题,顺手总结一下用原生API处理数组交集/并集的方法。

首先介绍连个原生js方法:

1.Array.prototype.filter()方法

1
array.filter(function(currentValue,index,arr), thisValue)

currentValuex是当前元素,
index,当前元素下标,
arr当当期数组对象。

filter()方法接收一个函数,和一个可选值thisValue,返回符合条件的一个新数组。

实例

1
2
3
4
var o = [345,23,1,2];
var b = o.filter(function(cur) {
return cur > 40;
})//b = [345]

2.Array.prototype.reduce()方法

array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

reduce()方法接收一个计数器函数和initialValue初始值(可选)

其中,函数的参数
total结果值, currentValue当前元素, currentIndex当前元素索引值, arr当期数组对象
实例:

1
2
3
4
var a = [1,2];
var sum = a.reduce(function(res,cur,index) {
return res + cur
})//3

多数组交集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 求多个数组交集
* @param arr [[1,,,],[b,,,],,,] 数组集合
*/
function intersection(arr) {
var result = arr[0];
arr.reduce(function(res,cur,index){
result = result.filter(function(n){
return cur.indexOf(n)!=-1;
})
return result;
})
return result;
}
var a = [[1,2,11],[11,11,2,1,3]];
var res = intersection(a);
console.log(res);//[1,2,11]

多数组并集

1
2
3
4
5
6
7
8
function merge() {
return Array.prototype.concat.apply([], arguments)
}
merge(arr1,arr2,arr3,...)
var arr1 = [1,2],
arr2 = [3],
arr3 = [2];
var union = merge(arr1,arr2,arr3)//[1,2,3,2]

ES7有更简洁的方法

交集

1
2
3
let a = [1,2]
let b = [2,3]
let intersection = a.filter(v => b.includes(v))console.log(intersection)//[2]

并集

1
2
3
4
let a = [1]
let b = [2]
let union = a.concat(b.filter(v => !a.includes(v)))
console.log(union)//[1,2]

判断元素是否在数组中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/** 判断参数值是否在数组中
* @param id 参数值
* @param source 源数组
*/
var inArray = function (id, source) {
var inFlag = false;
source.map(item => {
if (id == item) {
inFlag = true;
}
})
return inFlag;
}
//使用
var id = 1;
var arr = [1,3,4];
var isInArray = inArray(id,arr);//true