들어가며
가끔씩 조건에 따라 달라지는 객체가 필요할 때가 있습니다.
If else로 하나씩 넣기
let obj = {}
if(includeA) {
obj = { a : 3, b : 3 }
}
else {
obj = { b : 3 }
}
코드 그대로 includeA가 true 이면 {a : 3} 이 포함되고 아니면 없는 경우인데요.
위의 예시처럼 if else로 조건을 추가할 경우에, 조건이 들어날수록 if else이 2배씩 늘어난다는 치명적인 단점이 있습니다.
삼항연산자로 넣어주기
그래서 일반적으로 아래와 같이 삼항연산자를 이용해 각 조건별로 값을 넣어주는 방식을 사용하기도 합니다.
let includeA = true;
let includeB = false;
let obj = {
a : includeA ? 3 : undefined,
b : includeB ? 3 : undefined,
c : 3
}
//obj = { a : 3, b : undefined, c : 3}
객체의 key도 안넣고 싶은 경우
위의 2가지 상황은 obj에 undefined로 입력된 key값이 존재하게 됩니다.
const obj = {
a: "a",
b: undefined,
};
const obj2 = {
a: "a",
};
console.log(obj.b) // undefined
console.log(obj.b) // undefined
둘다 console.log에 찍어보면 undefined로 나오는 건 똑같습니다.
하지만 가끔 undefined가 없는 { a: "a"} 가 필요할때가 종종 있습니다.
1. 조건에 따라 객체를 재조립하기
if(includeA){
obj = {...obj, ...{a:3}} // {...obj, a:3} 도 가능
}
if(includeB){
obj = {...obj, ...{b:3}} // {...obj, b:3} 도 가능
}
첫번째 방법은 조건이 추가되는 경우 if 문이 계속해서 늘어나고 완성된 객체의 모습을 한눈에 파악하기 어렵다는 단점이 있습니다.
2. 조건에 따라 객체를 재조립하기
let includeA = true;
let includeB = false;
let obj = {
...(includeA && { a : 3 }),
...(includeB && { b : 3 }),
c : 3
}
// obj = { a:3 , c:3}
spread 연산자와 &&연산자를 이용한 방법입니다.
가장 직관적이면서 심플한 방법입니다.
&&연산자의 경우 앞에 조건들이 참일 경우 마지막에 있는 값이 할당되는 특징이 있습니다.
따라서 includeA가 true 이면 { a : 3 } 이 값이 되고 spread 연산자에 의해 풀어진 후 객체에 들어가게 되는 로직입니다.
React Props에도 적용해보기 (22.08.19 추가)
ComponentByType 컴포넌트가 있는데 type, typeAprop, typeBprop를 받는다고 가정하겠습니다.
이때 type은 "a" | "b"가 올 수 있으며 각각의 타입에 따라 가져야할 prop이 추가됩니다.
if (type === "a") {
return <ComponentByType type="a" typeAprop={"aProp"} />;
} else {
return <ComponentByType type="b" typeBprop={"bProp"} />;
}
이를 코드로 나타내면 이렇게 됩니다.
하지만 조건부로 속성을 추가하는 위의 방식을 적용하면
<ComponentByType
type={type as "a" | "b"}
{...(type === "a" && {
typeAprop: "aProp"
})}
{...(type === "b" && {
typeBprop: "bProp"
})}
/>;
이렇게 됩니다.
코드로 보면 위에 것이 더 편해보일수도 있습니다.
하지만 prop 갯수가 많아지고 저 코드 역시도 jsx return에 삼항연상자로 들어가야하는 경우를 생각한다면
아래의 방식이 훨씬 유용한 방법임을 알게됩니다.
마무리
단순 자바스크립트 객체의 예시부터 리액트 컴포넌트의 prop까지 넘기는 방법을 알아보았습니다.
모두들 행복 코딩하십쇼.
끝.
'개발 > 자바스크립트' 카테고리의 다른 글
[자바스크립트] 객체를 복사하는 다양한 방법에 대하여 (0) | 2021.02.22 |
---|---|
[자바스크립트] primitive, 그 중에서도 null 에 대하여 (0) | 2021.02.17 |
[자바스크립트]JS다운 코드 스타일 #4. 비구조화 할당 (0) | 2020.11.20 |
[자바스크립트] scope chain 과 variable shadowing에 대해 (0) | 2020.11.11 |
[자바스크립트]JS다운 코드 스타일 #3. 배열, 함수형 프로그래밍 (0) | 2020.10.15 |
댓글