当前位置: 移动技术网 > 移动技术>移动开发>Android > 穿梭框底层数据处理

穿梭框底层数据处理

2020年07月23日  | 移动技术网移动技术  | 我要评论

题目

给出原数组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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网