arrow function 에서 객체 리터럴 리턴하기
가끔 할때마다 세부 문법을 까먹어서 다시 찾아서 정리함.
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions
return 생략
기본적으로 arrow function 의 body 에 expression 하나만 쓰면 return expression 과 같다.
(param1, param2, …, paramN) => expression
// equivalent to: => { return expression; }
객체 리터럴을 리턴하고 싶다.
원하는건 이런 모양새
let pair = (p1, p2) => SOMETHING;
console.log(pair("v1", "v2"))
//expect: { v1: "v2" }
그냥 객체 리터럴을 써볼까?
let pair = (p1, p2) => {p1: p2};
console.log(pair("v1", "v2"));
//gets undefined
안된다.
객체 리터럴을 리턴하려면 괄호로 싸줘야한다.
// Parenthesize the body of function to return an object literal expression:
params => ({foo: bar})
pair 에 적용해보면
let pair = (p1, p2) => ({p1: p2});
console.log(pair("v1", "v2"));
//gets {p1: "v2"}
그런데 객체는 리턴하게 됐지만 key 가 원하는대로 다이나믹하게 들어가지 않는다.
찾아보면 ES2015 의 Object initializer 에 computed property name syntax 가 들어왔다.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer#New_notations_in_ECMAScript_2015
{
[SOMETHING] : val
}
다시 pair 에 적용해보면
let pair = (p1, p2) => ({[p1]: p2});
console.log(pair("v1", "v2"));
//gets {v1: "v2"}
다른 예제로.
['a','b','c'].map( e => {val: e})
// [undefined, undefined, undefined]
['a','b','c'].map( e => ({val: e}))
//[ {val: "a"}, {val: "b"}, {val: "c"} ]
['a','b','c'].map( e => ({[e]: e}))
//[ {a: "a"}, {b: "b"}, {c: "c"} ]