项目中有个需求,编辑操作中展示当前回显数据的新增、删除操作对应数据(多选框组/tree树结构),根据需求来看就是对两个不同数组对象进行数据对比,得出有差异的数据。
数据
const showList=[
{
name:'张三',
id:1,
age:18,
},
{
name:'李四',
id:2,
age:19,
},
{
name:'王五',
id:3,
age:20,
},
];
const checkList= [
{
name:'张三',
id:1,
age:18,
},
{
name:'王五',
id:3,
age:20,
},
{
name:'赵六',
id:4,
age:18,
},
];
方案一:loadsh (文档)
/**
* _.differenceWith(array, [values], [comparator])
* 这个方法类似[_.difference],除了它接受一个 comparator(注:比较器),它调用比较array,values中的元素。
* 结果值是从第一数组中选择。comparator 调用参数有两个:(arrVal, othVal) 。
*/
// 例子:
// var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
// _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
// => [{ 'x': 2, 'y': 1 }]
let deleteData = _.differenceWith(showList, checkList, _.isEqual);
// [{name:'李四',id:2,age:19,}]
let addData = _.differenceWith(checkList, showList, _.isEqual);
// [{name:'赵六',id:4,age:18,}]
注意:1、当对比的数据量很大时,对比的时间会很慢;
方案二:Map(文档)
/*
* 先将数组转为Map对象,id为key;对象为value
* 选中数据触发change时,Map中对象中包含该对象,删除map中该条数据;
* 不包含该对象时,即为新增操作
* 剩余的map数据即为删除的数据
*/
let showMap = new Map();
let addData = [];
let deleteData = [];
showPosList.forEach(item => showMap.set(item.id, item));
// 新增
checkPosList.forEach(check => {
if (showMap.has(check.id)){
showMap.delete(check.id);
} else {
addData.push(check);
}
});
deleteData = [...showMap.values()];
注意:当对比的数据量很大时,对比的时间会比loadsh快很多