Jak warunkowo dodać właściwość do obiektu?
Jak możemy warunkowo dodać jakąś właściwość do obiektu? Można to zrobić na kilka sposobów.
Tradycyjny sposób to dodanie prostego if’a:
const obj = { a: 1}
if (someCondition) { obj.b = 2;}
JSON.stringify(obj) // '{"a":1,"b":2}'Działa, aczkolwiek nie jest to zbyt eleganckie podejście.
Najbardziej idiomatyczne rozwiązanie, to wykorzystanie spread operator wewnątrz obiektu, wraz z operatorem logicznym &&.
const obj = { a: 1, ...someCondition && {b: 2}}
JSON.stringify(obj) // '{"a":1,"b":2}'Co się tutaj dzieje?
Operator logiczny && zwróci wyrażenie po jego prawej stronie, jeżeli wyrażenie z lewej strony będzie truthy.
Gdyby po lewej stronie operatora, wyrażenie miało wartość false (lub jakąkolwiek inną wartość falsy - null, undefined, 0, ""), to zwrócona byłaby ta wartość.
A więc, gdyby someCondition miało wartość true to zostałby zwrócony obiekt {b: 2}.
Teraz wkracza spread operator (...), który “rozbija” obiekt po swojej prawej stronie i zwraca wszystkie właściwości tego obiektu.
Ponadto, gdy spread operator natrafi po swojej prawej stronie np. na false lub null to nic się nie wydazry i nic nie przypisze do obiektu.
Zatem ...someCondition && {b: 2} zwróci albo właściwości obiektu po prawej stronie operatora && albo nic się nie wydarzy.
Aby całość była bardziej czytelna, możemy dodać okrągłe nawiasy do całego wyrażenia:
const obj = { a: 1, ...(someCondition && {b: 2})}