欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

穿梭框底层数据处理

程序员文章站 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

相关标签: 算法 javascript