js比较两个对象数组,并标记?

420 阅读1分钟

需求

假设有两个数组 initArr = [a,b,c,d],latestArr = [a,c,d,e,f],合并数组并作出标记,比较之后的结果是 initArr = [a,b,c,d,e,f],

  1. 最新的initArr中a元素相比较原initArr和latestArr,都存在,所以给最新的initArr中的a(Object),标记为flag = "";
  2. 最新的initArr中b元素在原initArr中存在,但是在latestArr中不存在,所以给最新的initArr中的b(Object)标记为flag ="delete";
  3. 最新的initArr中e元素在原initArr中不存在,但是在latestArr中存在,所以给最新的initArr中的e(Object)标记为flag ="add";

题目的意思大概就是这样,(本人表达能力不强)不知道圈里大佬是否理解题目?

代码

程序员的世界,惜字如金,代码直接安排上;

let originArr = [
            {
                label: '张三',
                // value: 1,7 6他6他      
                children: [
                    // {
                    //     label: '张三的儿子',
                    //     // value: 11,
                    //     // flag: 'del'
                    //     children: []
                    // }
                ]
            }
            //  {
            //     label: 'zjangso',
            //     children: [{
            //         label: 'test1',
            //         children: []
            //     },
            //     {
            //         label: 'test2',
            //         children: []
            //     }
            //     ]
            // }

        ]
        let updateArr = [
            {
                label: '张三',
                // value: 1,
                children: [
                    {
                        label: '张三的儿子',
                        // value: 12,
                        children: []

                    }
                ]
            }
            // , {
            //     label: 'zjangso',
            //     children: [{
            //         label: 'test2',
            //         children: []
            //     },
            //     {
            //         label: 'test3',
            //         children: []
            //     }]
            // }, {
            //     label: 'haha',
            //     children: []
            // }
        ]
        function deepCompare(arr, compareArr) {
            var o;
            o = [];
            arr.forEach(item => {
                let tmp = compareArr.find(sub => sub.label === item.label)
                if (!tmp) { 
                    item.flag = 'del'
                    o.push(item)
                }
            })
            compareArr.forEach(item => {
                let tmp = arr.find(sub => sub.label === item.label)
                if (!tmp) {
                    item.flag = 'add'
                    o.push(item)
                }
            })
            arr.map(item => {
                let tmp = compareArr.find(sub => item.label === sub.label)
                if (tmp) {
                    let pre = { ...item }
                    pre.flag = ''
                    if (item.children && item.children.length || tmp.children && tmp.children.length) {
                        pre.children = deepCompare(item.children, tmp.children)
                    }
                    o.push(pre)
                }
            })
            console.log(o)
            return o
        }
        let result = deepCopy(originArr, updateArr)

        console.log(result)

代码大概就这样,因本人比较菜,代码可能有误,希望各位大佬多多指教