자바스크립트 배열을 객체로 변환하기

프로미스 객체를 반환하는 함수들이 있고 그 함수들을 한번에 처리하는 Promise.allSetteld()를 사용하였습니다.

const exEmail = dataWorker.FindEmailToJoin(email);
const exNick = dataWorker.FindNick(nickname);
const matchedPass = dataWorker.MatchPasswordToLogin(password, repassword);
const hash = dataWorker.MakeHash(matchedPass);

const valid = await Promise.allSettled([exEmail, exNick, hash]);

여기서 valid변수의 값이 배열 형식이더라구요. Promise.allSetteld()함수안에 인수들은 이메일이 존재하는지, 닉네임이 존재하는지, 비밀번호를 해쉬화 시킨값 등을 나타냅니다. valid 배열안에는 값이 다음과 같은 형식으로 들어있었습니다.

0:{status: 'fulfilled', value: '[email protected]'}
1:{status: 'fulfilled', value: 'user'}
2:{status: 'fulfilled', value: '$2b$12$zdYwq8dY7kWTx.Ow1UaZf.ufuXEIJrEOP.WHfg8Nk8SZbHr9xXhHy'}

문제는 valid 안에 있는 인덱스 내의 객체들(ex: ‘[email protected]’, ‘user’)을 다른 함수에서 인수로 사용해야 하는데 배열값이다보니 인덱스로 접근을 해야한다는 것입니다. 예를 들어 valid안에서 이메일을 사용한다면 valid[0].value 이런식으로 말이죠 뭔가 형평성이 맞지 않다고 생각하여 데이터타입을 변경하고 싶은데 변수(ex const email = valid[0].value)로 선언하는 방식이아닌 valid[0].value 대신 valid.email을 사용하여 '[email protected]’를 참조하는 방법이 있을까요?

이 두 문서를 참고하시는 게 어떨는지요.

const valueArray = await Promise.allSettled([exEmail, exNick, hash])
                                .then(settle => settle.map(res => res.value));
// "value" 키의 값만 추출한 배열로 변환
const [email, nick, hash] = valueArray;
// valueArray를 전개하여 각각의 이름을 할당한 변수 생성
const valid = { email, nick, hash };

이렇게 할 수 있습니다. 다만 예시 코드의 경우, hash라는 변수 이름이 중복되므로 생략 표기법(shorthand property)은 어려울 수 있습니다.
그렇다면 직접 이름에 값을 할당하는 방법으로 하면 됩니다.

const valueArray = await Promise.allSettled([exEmail, exNick, hash])
                                .then(settle => settle.map(res => res.value));
const [email, nick, hashValue] = valueArray;
const valid = { email, nick, hash: hashValue}; // 변수 이름이 중복되지 않음

감사합니다! 덕분에 도움이 되었습니다. 생각해보니 굳이 객체까진 사용안해도 프로미스에서 성공한 결과값을 then으로 받아 배열메서드로 값을 받아오는 코드는 도움이 많이되었습니다

혹시 코드에서 사용된 변수 settle과 res의 의미가 무엇을 뜻하는지 알려주실수 있을까요?

메소드 네임이 allSettled라 settlement의 settle를 썼고, result의 res를 썼습니다. 별다른 의미는 없습니다.

1개의 좋아요

감사합니다!