先看题目:
示例:
我的思路:
根据题目要求,可以直接采用哈希表存入两个数组的元素,键值对为<id, item>,item就是数组中的每个元素,首先存入arr1的元素,然后再遍历arr2,根据题目要求,如果哈希表中有与arr2中元素同名的id,arr1相同的键值对就替换成arr2的,不同的直接保留。要实现这个需求,可以自己写一个方法来实现,可以利用到Object.hasOwnProperty()方法,合并时需要注意的是不能打乱原来键值对的顺序,意思是如果arr2中单独出现的键值对在合并时就只能添加到对象的后面。这里我们可以直接使用Object.assign()方法,非常方便,最后,将哈希表中的值根据id升序排个序再转换为数组返回即可。
代码:
JavaScript:
// 根据 ID 合并两个数组
function join(arr1, arr2) {
const hashMap = new Map();
// 将arr1存入哈希表中,键为id,值为数组元素
for (const item of arr1) {
const { id } = item;
hashMap.set(id, item);
}
// 遍历arr2,将元素存入哈希表中
for (let item of arr2) {
const { id } = item;
// 如果表中有跟arr2中元素相同的id,就将两个对象进行合并再存入
if (hashMap.has(id)) {
const cur = hashMap.get(id);
item = Object.assign(cur, item);
hashMap.set(id, item);
continue;
}
// 没有则直接存入
hashMap.set(id, item);
}
// 排序后以数组返回
return [...hashMap.values()].sort((a, b) => { return a['id'] - b['id']; });
};
console.log(join([
{ "id": 1, "b": { "b": 94 }, "v": [4, 3], "y": 48 }
], [
{ "id": 1, "b": { "c": 84 }, "v": [1, 3] }
]));
TypeScript:
function join(arr1: any[], arr2: any[]): any[] {
const hashMap: Map<number, object> = new Map<number, object> ();
for(const item of arr1) {
const { id } = item;
hashMap.set(id, item);
}
for(let item of arr2) {
const { id } = item;
if(hashMap.has(id)) {
const cur: object = hashMap.get(id);
item = Object.assign(cur, item);
hashMap.set(id, item);
continue;
}
hashMap.set(id, item);
}
return [...hashMap.values()].sort((a, b) => {return a['id'] - b['id'];});
};