differenceBy【获取新增数组】🔥
描述
比较两数组之间值的不同,存在数组1中,不存在数组2中 v3.1.4+
# 1.示例
import { intersection } from 'sf-utils2'
console.log(differenceBy([3.1, 2.2, 1.3], [3.1, 4.4, 2.5, 1.3], (a, b) => a === b))
// => [3.1, 1.3]
console.log(differenceBy([{ x: 2 }, { x: 1 }], [{ x: 1 }], 'x'))
// => [{ 'x': 2 }]
1
2
3
4
5
6
2
3
4
5
6
# 2.入参说明
| 参数 | 说明 | 类型 | 是否必填 | 默认值 |
|---|---|---|---|---|
| newArray | 新数组 | Array | 是 | |
| oldArray | 老数组 | Array | 是 | |
| condition | 条件 | string[]、string | 否 |
# 3.源码
源码,点开查看 👈
import isString from '@/base/isString'
import isFunction from '@/base/isFunction'
import arrayToMap from '@/array/arrayToMap'
import uniq from '@/array/uniq'
/**
* 比较两数组之间值的不同,存在数组1中,不存在数组2中
* 本质上是求出哪些是删除的
* @param {Array} array1 数组1
* @param {Array} array2 数组2
* @param {string|function(a:any, b?:any):boolean|number} [condition] 条件
* @returns {*[]}
*/
function differenceBy(array1, array2, condition) {
const result = []
if (!condition) {
// 无条件
let array1Map = arrayToMap(array1)
let array2Map = arrayToMap(array2)
array1Map.forEach((v, k) => {
if (!array2Map.has(k)) {
result.push(v)
}
})
} else if (isString(condition)) {
// 是有条件 且是字符串
const arrayToMapOpts = { valueType: 'array' }
let array1Map = arrayToMap(array1, condition, arrayToMapOpts)
let array2Map = arrayToMap(array2, condition, arrayToMapOpts)
array1Map.forEach((v, k) => {
if (!array2Map.has(k)) {
result.push(...v)
}
})
} else if (isFunction(condition)) {
// 是有条件 且是方法
array1.forEach(a =>
array2.forEach(b => {
if (!!condition(a, b)) {
result.push(a)
return true
}
return false
})
)
}
return uniq(result)
}
export default differenceBy
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
上次更新: 2024/01/16, 00:14:12