arrayDiff【比较数组差异】🔥🔥
描述
比较两数组之间值的不同 比如新增哪些数据、删除了哪些数据、 v3.1.4+
# 1.示例
// 普通匹配
console.log(arrayDiff([3.1, 2.2, 1.3], [3.1, 4.4, 2.5, 1.3]))
// => { addList: [3.1, 1.3], delList: [2.2] }
// 传入属性diff
console.log(arrayDiff([{ x: 2 }, { x: 1 }], [{ x: 1 }, { x: '2' }], 'x'))
// => { addList: [{ 'x': '2' }], delList: [{ 'x': 2 }] }
// => { addList: [{ 'x': '2' }], delList: [{ 'x': 2 }] }
const list = [
{ empId: 1, empName: '蔡徐坤' },
{ empId: 2, empName: '小明' },
{ empId: 3, empName: '小红' }
]
const list2 = [
{ empId: 4, empName: '蔡徐坤1' },
{ empId: 2, empName: '小明' },
{ empId: 7, empName: '小军' },
{ empName: '周杰伦' },
{ empName: '小吴' }
]
console.log(arrayDiff(list, list2, 'empId'))
// =>
// {
// addList: [
// {empId: 4, empName: '蔡徐坤'},
// {empId: 7, empName: '蔡徐坤'},
// {empName: '周杰伦'},
// {empName: '小吴'}
// ],
// delList: [
// {empId: 1, empName: '蔡徐坤'},
// {empId: 3, empName: '蔡徐坤'}
// ]
// }
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
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
# 2.入参说明
| 参数 | 说明 | 类型 | 是否必填 | 默认值 |
|---|---|---|---|---|
| newArray | 新数组 | Array | 是 | |
| oldArray | 老数组 | Array | 是 | |
| condition | 条件 | string[]、string | 否 |
# 3.源码
源码,点开查看 👈
import arrayToMap from '@/array/arrayToMap'
import isString from '@/base/isString'
import uniq from '@/array/uniq'
import isArray from '@/base/isArray'
/**
* 比较两数组之间值的不同
* 比如新增哪些数据、删除了哪些数据、
* @param {Array} newArray 数组1
* @param {Array} oldArray 数组2
* @param {string|string[]} [condition] 条件
* @returns {{delList: *[], addList: *[]}}
*/
function arrayDiff(newArray, oldArray, condition) {
const addList = [], // 新增的数据
delList = [] // 删除的数据
if (!condition) {
// 无条件
let newArrayMap = arrayToMap(newArray)
let oldArrayMap = arrayToMap(oldArray)
newArrayMap.forEach((v, k) => {
if (!oldArrayMap.has(k)) {
// 删除
delList.push(v)
}
})
oldArrayMap.forEach((v, k) => {
if (!newArrayMap.has(k)) {
// 新增的
addList.push(v)
}
})
} else if (isString(condition) || isArray(condition)) {
// 是有条件 且是字符串 或者是 字符串数组
const arrayToMapOpts = { valueType: 'array', retainKeyWithNull: true }
let newArrayMap = arrayToMap(newArray, condition, arrayToMapOpts)
let oldArrayMap = arrayToMap(oldArray, condition, arrayToMapOpts)
newArrayMap.forEach((v, k) => {
if (!oldArrayMap.has(k)) {
// 删除的
delList.push(...v)
}
})
oldArrayMap.forEach((v, k) => {
if (!newArrayMap.has(k)) {
// 新增的
addList.push(...v)
}
})
}
return {
addList: uniq(addList), // 新增的列表
delList: uniq(delList) // 删除的列表
}
}
export default arrayDiff
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
52
53
54
55
56
57
58
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
52
53
54
55
56
57
58
上次更新: 2024/01/16, 00:14:12