数组合并-题,

491 阅读1分钟

数据合并

let arr1 = [
    {x1y1},
    {x2y4},
    {x3y3},
    {x4y3},
    {x5y2},
    {x6y3},
    {x7y4},
]
let arr2 = [
    {x2y3},
    {x3y2},
    {x5y4},
    {x8y1},
    {x10,y3}
 ]

两个数组,要求将数组1和数组2合并,如果数组二中对象属性x值与数组一中值相同,则合并该项,并使用数组2中的对象,如果数组2中没有与数组1中匹配的,则添加,

要求:不能改变原数组

输出如下:
[
    {x1y1}, 
    {x2y3},  // 变化
    {x3y2},  // 变化
    {x4y3},
    {x5y4},  // 变化
    {x6y3},
    {x7y4},
    {x8y1},  // 新增
    {x10,y3}   // 新增
]

实现思路:

  1. 拷贝两个数组
  2. 循环遍历
  3. 替换
  4. 进行排序

实现代码:

function fn(a=[],b=[]) {
            let arr1 = JSON.parse(JSON.stringify(a)) // 拷贝
            let arr2 = JSON.parse(JSON.stringify(b)) // 拷贝
            let arr3 = []
            arr1.forEach((item, index) => { //遍历
                arr2.forEach((i,ind) => {
                    if (item.x === i.x) { // 如果数组1中x值与数组2中值相等,替换数组1中该下标元素,并移除数组2中对应下标元素
                        arr1.splice(index,1,i)
                        arr2.splice(ind, 1)
                    }
                })
            });
            // 扩展运算符+sort排序,避免因为移除操作导致的乱序问题
            return arr3 = [...arr1, ...arr2].sort((a,b) => a.x - b.x)
        }
        console.log(fn(arr1,arr2))