条件是两整型数组,用于比较后一个数组相比前一个数组 增加了哪些数据,减少了哪些数据,看过vue2 DOM diff的同学就会知道,虚拟DOM比较的是DOM对象集合的差异,我们这里稍微简单些,是俩整型数组对比
interface ResMap {
add: Array<number | string>
remove: Array<number | string>
}
interface CompareMap {
[key: string]: string | number
}
/**
* before => 差异前数组 type: Array<number | string>
* after => 差异后数组 type: Array<number | string>
*/
public static compareArray(before: Array<number | string>, after: Array<number | string>) {
let res: ResMap = {
add: [],
remove: []
}
let compareMap: CompareMap = {}
for (let i = 0; i < before.length; i++) {
compareMap[before[i]] = before[i]
}
// 差异比较 compareMap中保存的是before有的而after不存在的
for (let i = 0; i < after.length; i++) {
if (!compareMap[after[i]]) {
res.add.push(after[i])
} else {
delete compareMap[after[i]]
}
}
for (let j in compareMap) {
res.remove.push(parseInt(j))
}
return res
}
核心思想: compareMap中数据,就是用来对比移除的,当俩数组对比完成后,仍在compareMap中的数据,就是比较后,后数组比前数组,减少的数据,增加或减少的数据,都存在res里,以对象形式返回。