提高数据对比的速度
项目中经常会遇到新旧数据对比,下面是数据对比的两种方法:
需求是将students数组与data数组进行对比,将students中checked为true的数据更新到data中。
数据:
// 缓存数据
let students = [
{ id: 35, name: '小明', age: 25, address: '环球中心',checked:true},
{ id: 36, name: '杰伦', age: 41, address: '中国台湾' ,checked:true},
{ id: 37, name: '不撸死', age: 46, address: '霉国' ,checked:true}
]
// 最新数据
let data = [
{ id: 35, name: '小明', age: 25, address: '环球中心',checked:false },
{ id: 36, name: '杰伦', age: 41, address: '中国台湾' ,checked:false},
{ id: 37, name: '不撸死', age: 46, address: '霉国' ,checked:false},
{ id: 38, name: '大明', age: 46, address: '哈哈哈哈哈' ,checked:false},
{ id: 39, name: '中明', age: 46, address: '中国四川' ,checked:false}
]
方法一:双层循环对比数据
let count = 0;
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < students.length; j++) {
count++
if (data[i].id === students[j].id) {
data[i].checked = true;
}
}
}
console.log(count, data)
利用count记录执行次数,双层循环后执行的次数为5 * 3 = 15次;
方法二:将数据转换成json对象进行对比
let count = 0;
function arrayToJson(arr, obj = {}) {
arr.forEach((val, index) => {
obj[val.id] = val;
count++
})
return obj
}
students = arrayToJson(students);
for (let i = 0; i < data.length; i++) {
if (students[data[i].id]) {
data[i].checked=true
}
count++
}
console.log(count, data);
count结果:3 + 5 = 8次;
通过对比发现,先将数组转换成json对象再进行对比执行的次数少,可以提高对比速度;假设数据的长度均为n,那么双层循环的时间复杂度为n*n,通过这样处理,时间复杂度降至n+n,数据越多,提高的速度越明显。