문제 링크
https://leetcode.com/problems/join-two-arrays-by-id/description/?envType=study-plan-v2&envId=30-days-of-javascript
1. 두 배열을 합치면서, id값이 같은 경우 arr2로 override
const merged = [...arr1, ...arr2]
.reduce((acc, item) => {
acc.set(item.id, item);
return acc;
}, new Map());
2. 두 배열을 합치면서, id값이 같지만 arr1에만 있는 값이 있을 경우, 병합 (문제에서 요구한 케이스)
const merged = [...arr1, ...arr2].reduce((acc, item) => {
const existing = acc.get(item.id) || {};
acc.set(item.id, { ...existing, ...item });
return acc;
}, new Map());
3. 풀어서 해결하는 케이스
var join = function(arr1, arr2) {
const map = new Map();
// 먼저 arr1을 넣는다
for (const item of arr1) {
map.set(item.id, { ...item });
}
// arr2를 넣되, 기존 값과 병합 (arr2 우선)
for (const item of arr2) {
if (map.has(item.id)) {
const merged = { ...map.get(item.id), ...item };
map.set(item.id, merged);
} else {
map.set(item.id, { ...item });
}
}
// id 기준 정렬 + 반환
return Array.from(map.values()).sort((a, b) => a.id - b.id);
};
4. 최종 제출한 정답
/**
* @param {Array} arr1
* @param {Array} arr2
* @return {Array}
*/
// id가 같으면 arr2가 override
var join = function(arr1, arr2) {
const merged = [...arr1, ...arr2].reduce((acc, item) => {
const existing = acc.get(item.id) || {};
acc.set(item.id, { ...existing, ...item });
return acc;
}, new Map());
// id값으로 오름차순 정렬순 출력
return Array.from(merged.values()).sort((a, b) => a.id - b.id);
};