需求:
现给定两个数组 arr1
和 arr2
,返回一个新的数组 joinedArray
。两个输入数组中的每个对象都包含一个 id
字段。joinedArray
是一个通过 id
将 arr1
和 arr2
连接而成的数组。joinedArray
的长度应为唯一值 id
的长度。返回的数组应按 id
升序 排序。
如果一个 id
存在于一个数组中但不存在于另一个数组中,则该对象应包含在结果数组中且不进行修改。
如果两个对象共享一个 id
,则它们的属性应进行合并:
- 如果一个键只存在于一个对象中,则该键值对应该包含在对象中。
- 如果一个键在两个对象中都包含,则
arr2
中的值应覆盖arr1
中的值。
废话不多说,上代码
/**
* @param {Array} arr1
* @param {Array} arr2
* @return {Array}
*/
var join = function(arr1, arr2) {
const idMap = new Map();
arr1.forEach(item => {
const { id, ...rest } = item;
if (!idMap.has(id)) {
idMap.set(id, { ...rest });
} else {
idMap.set(id, { ...idMap.get(id), ...rest });
}
});
arr2.forEach(item => {
const { id, ...rest } = item;
if (!idMap.has(id)) {
idMap.set(id, { ...rest });
} else {
idMap.set(id, { ...idMap.get(id), ...rest });
}
});
const joinedArray = Array.from(idMap, ([id, obj]) => ({ id, ...obj }));
joinedArray.sort((a, b) => a.id - b.id);
return joinedArray;
};
const arr1 = [{ id: 1, name: 'Alice' }, { id: 2, age: 30 }];
const arr2 = [{ id: 2, city: 'New York' }, { id: 3, gender: 'female' }];
const joinedArray = join(arr1, arr2);
console.log(joinedArray);
打印输出如下
代码讲解
-
在函数内部,创建一个
Map
对象idMap
,用于存储合并后的数据,其中键是id
,值是合并后的对象。 -
使用
forEach
方法遍历arr1
中的元素。对于每个元素,首先使用解构赋值提取id
和其余属性,并将其存储在变量rest
中。然后,检查idMap
中是否已经存在该id
。如果不存在,创建一个新对象并添加到idMap
中;如果已存在,将该元素的属性合并到现有对象中。 -
同样的操作也适用于
arr2
中的元素。 -
使用
Array.from
方法将idMap
转换为结果数组joinedArray
。在转换过程中,我们使用箭头函数将Map
的键值对转换为包含id
和合并属性的对象。 -
最后,对
joinedArray
进行按id
升序排序,以满足题目中的排序要求。 -
返回最终的
joinedArray
。
生活中最美好的事情通常在最不起眼的时刻发生