穿梭框底层数据处理
程序员文章站
2022-03-28 17:56:58
题目给出原数组list1,变更后数组list2获取list2相比list1新增的数据获取list2相比list1删除的数据获取list2相比list1不变的数据let list1 = [ { id: 1, name: "android开发" }, { id: 2, name: "传媒艺术" }, {...
题目
给出原数组list1,变更后数组list2
获取list2相比list1新增的数据
获取list2相比list1删除的数据
获取list2相比list1不变的数据
let list1 = [
{
id: 1,
name: "android开发"
},
{
id: 2,
name: "传媒艺术"
},
{
id: 3,
name: "ios开发"
},
{
id: 4,
name: "工商管理"
},
{
id: 5,
name: "会计"
},
{
id: 6,
name: "物流"
}
]
let list2 = [
{
id: 1,
name: "android开发"
},
{
id: 3,
name: "ios开发"
},
{
id: 7,
name: "软件测试"
},
{
id: 8,
name: "美工"
}
]
这道题相信很多人都不陌生,在项目开发中,手写穿梭框组件或者对一组原有数据任用户修改的情况,都需要统计这些数据
解题方案1
这是很多刚入门的解题思路,使用循环嵌套,逐个对比
function f(arr1,arr2) {
let addList = [],removeList = [],originalList = [];
for (let i = 0; i < arr1.length; i++) {
let isHave = 0
for (let j = 0; j < arr2.length; j++) {
if (arr1[i].id === arr2[j].id) {
originalList.push(arr1[i])//相同的
break
}
else
isHave += 1
}
if (isHave === arr2.length)
removeList.push(arr1[i]) // 存在list1不存在list2
}
for (let i = 0; i < arr2.length; i++) {
let isHave = 0
for (let j = 0; j < arr1.length; j++) {
if (arr1[j].id !== arr2[i].id)
isHave += 1
}
if (isHave === arr1.length)
addList.push(arr2[i])//存在list2不存在list1
}
return {addList, removeList, originalList}
}
解题方案2
这种算法趋近于对对象或者算法有一定了解的人,或对java集合有一定了解的人常用解法
function fn(arr1, arr2) {
let addList = [],removeList = [],originalList = [];
let spareArr1 = {},spareArr2 = {};
for (let i = 0; i < arr1.length; i++) {
spareArr1[arr1[i].id] = arr1[i]
}
for (let i = 0; i < arr2.length; i++) {
spareArr2[arr2[i].id] = arr2[i]
if (spareArr1[arr2[i].id])
originalList.push(arr2[i])// 取出 arr2相比arr1不变的数据
else
addList.push(arr2[i])// 取出 arr2相比arr1新增的数据
}
for (let i = 0; i < arr1.length; i++) {
!spareArr2[arr1[i].id] && removeList.push(arr1[i])// 取出 arr2相比arr1删除的数据
}
return {addList, removeList, originalList}
}
调用嵌套方法
console.time("A")
console.log(JSON.stringify(f(list1,list2)))
console.timeEnd("A")
调用匹配方法
console.time("B")
console.log(JSON.stringify(fn(list1, list2)))
console.timeEnd("B")
答案
{
"addList": [
{"id": 7, "name": "软件测试"},
{"id": 8, "name": "美工"}
],
"removeList": [
{"id": 2, "name": "传媒艺术"},
{"id": 4, "name": "工商管理"},
{"id": 5, "name": "会计"},
{"id": 6, "name": "物流"}
],
"originalList": [
{"id": 1, "name": "android开发"},
{"id": 3, "name": "ios开发"}
]
}
在数据量大的情况下,使用匹配算法效率更高,在小数据情况下,两种方法效率相差甚微
本文地址:https://blog.csdn.net/weixin_43840202/article/details/107402578