[Dart/Flutter] 두개의 Map 하나로 합치기
September 28, 2023
두개 이상의 Map을 하나의 Map으로 병합하는 방법에 대해서 알아보겠습니다. Map을 합칠 때 key가 모두 다르다면 문제는 없지만, 동일한 key가 다른 값을 갖고 있을 때는 어떤 값을 우선시할지에 따라서 구현 방법이 달라져야 합니다.
1. Spread Operator(전개 연산자)를 이용한 방법
Spread Operator는 ...var
같은 표현 방법인데, 객체가 갖고 있는 요소를 나열합니다.
아래와 같이 Spread Operator를 사용하면 Map 안의 요소들을 나열하여 새로운 Map의 요소에 포함됩니다.
{...map1, ...map2}
: map을 선언할 때, map1과 map2의 요소를 초기 값으로 입력- map1과 map2는 변하지 않고, 합쳐진 새로운 map이 생성됨
- 동일한 key가 있을 때, map2(뒤에 있는)의 값으로 업데이트됨
void main() {
Map<String, int> map1 = {'a': 1, 'b': 2, 'c': 3};
Map<String, int> map2 = {'d': 4, 'e': 5, 'f': 6, 'c': 7};
Map<String, int> mergedMap = {...map1, ...map2};
print(mergedMap);
}
Output:
{a: 1, b: 2, c: 7, d: 4, e: 5, f: 6}
2. addAll()을 이용한 방법
map1.addAll(map2)
는 map1에 map2의 모든 요소를 추가합니다.
- map1에는 map2의 요소가 추가되고, map2는 변경되지 않음
- map을 합칠 때, 원본 map 객체를 변경하지 않으려면 이 방법을 사용하면 안됨
- 동일한 key가 있을 때, map2의 값으로 업데이트됨
void main() {
Map<String, int> map1 = {'a': 1, 'b': 2, 'c': 3};
Map<String, int> map2 = {'d': 4, 'e': 5, 'f': 6, 'c': 7};
map1.addAll(map2);
print(map1);
}
Output:
{a: 1, b: 2, c: 7, d: 4, e: 5, f: 6}
3. putIfAbsent()를 이용한 방법
map1.putIfAbsent(key, 함수)
는 map1에 key가 존재하지 않으면 key를 추가하고, value는 함수의 리턴 값으로 설정됩니다. key가 존재하면 아무것도 등록하지 않습니다.
map1.putIfAbsent(key, () => value)
: map1에 key가 없을 때, key-value 쌍을 추가- 동일한 key 값이 추가될 때 무시할 수 있음 (초기 값 우선)
void main() {
Map<String, int> map1 = {'a': 1, 'b': 2, 'c': 3};
Map<String, int> map2 = {'d': 4, 'e': 5, 'f': 6, 'c': 7};
map2.forEach((key, value) {
map1.putIfAbsent(key, () => value);
});
print(map1);
}
Output:
{a: 1, b: 2, c: 3, d: 4, e: 5, f: 6}