[JS] 객체 비교하기

Seungeun·2024년 6월 10일

TIL

목록 보기
1/4

문제

if (req.body != {} ) >> true : req.body는 {}를 출력하는데 왜 true일까?

req.body도 {}이고 비교하는 것도 {}인데 왜 true가 뜨며
vsCode에서 아래와 같은 주의문을 주었다

if (req.body !== {} ){~}

"JavaScript는 값이 아닌 참조로 객체를 비교하므로 이 조건은 항상 'true'을(를) 반환합니다."

→ 즉 객체끼리는 항상 다를 수 밖에 없다. 객체를 비교할 때는 !==!= 를 잘 쓰지 않음.

해결방법

1. 순서가 같은 객체 비교

const obj1 = { name : "kim", job : "teacher" };
const obj2 = { name : "kim", job : "teacher" };

if (Object.entries(obj1).toString() == Object.entries(obj2).toString()  ) {
	console.log("true")}

Object.entries(객체) : [key,value] 쌍이 반환됨.
[ [ 'name', 'kim' ], [ 'job', 'teacher' ] ]

이렇게 변환한 string끼리 비교하는 것

이런 방법도 가능하다

if (JSON.stringify(obj) == JSON.stringify(com)) >> true

2. 그런데 객체는 순서가 안 중요하잖아?

const obj1 = { name : "kim", job : "teacher" };
const obj2 = { job : "teacher", name: "kim" };

const sortObj1 = Object.keys(obj1).sort().reduce( (obj,key)=> ((obj[key] = obj1[key], obj),{} }
const sortObj2 = Object.keys(obj2).sort().reduce((obj,key) => ((obj[key] = obj1[key], obj), {} }
                                                 
if (JSON.stringify(sortObj1) == JSON.stringify(sortObj2)) >> true
                                                 
                                                

const sortObj1 = Object.keys(obj1).sort().reduce( (obj,key)=> ((obj[key] = obj1[key], obj),{} }
이 코드를 자세히 알아보자
1. 먼저 keys값으로 ['name', 'job']으로 정렬한 후 이 배열을 가지고 reduce함수를 실행한다.
2. obj는 accumulator, key는 currentValue 인자로 obj[key] = obj1[key]는 새로운 obj 객체에 key값을 가지고 다시 담는 것이다.
3. 그 뒤에 오는 ,obj는 쉼표연산자로 obj를 반환한다.

피드백

JS의 기본적인 문법 조차 모르고 있어 이해도 안되고 처음에 vscode가 저런 문구를 날려주는데 이해를 못한 것이다.
항상 기초와 기본은 충실히 꾸준히 하자!!

profile
Wonderland

0개의 댓글