数据合并
let arr1 = [
{x: 1, y: 1},
{x: 2, y: 4},
{x: 3, y: 3},
{x: 4, y: 3},
{x: 5, y: 2},
{x: 6, y: 3},
{x: 7, y: 4},
]
let arr2 = [
{x: 2, y: 3},
{x: 3, y: 2},
{x: 5, y: 4},
{x: 8, y: 1},
{x: 10,y: 3}
]
两个数组,要求将数组1和数组2合并,如果数组二中对象属性x值与数组一中值相同,则合并该项,并使用数组2中的对象,如果数组2中没有与数组1中匹配的,则添加,
要求:不能改变原数组
输出如下:
[
{x: 1, y: 1},
{x: 2, y: 3}, // 变化
{x: 3, y: 2}, // 变化
{x: 4, y: 3},
{x: 5, y: 4}, // 变化
{x: 6, y: 3},
{x: 7, y: 4},
{x: 8, y: 1}, // 新增
{x: 10,y: 3} // 新增
]
实现思路:
- 拷贝两个数组
- 循环遍历
- 替换
- 进行排序
实现代码:
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))