Dado que en Javascript el encadenamiento opcional en el lado izquierdo de una tarea no es posible, como se indica en esta pregunta y respuesta , ¿cuáles son algunos métodos alternativos posibles para lograr esto?
customer.details?.car = { make: 'Toyta' } Sé que puedes hacer eso con un if
if (customer.details) { customer.details.car = { make: 'Toyota' }; } else { customer.details = { car: { make: 'Toyota' } }; }Probé con OR lógico || pero no estoy seguro de que sea posible y lo siguiente no es correcto
customer.(details || {}).car = { make: 'Toyota' };Ternario con trabajos extendidos (con ayuda de @garrettmills)
customer.details = customer.details ? { ...customer.details, car: { make: 'Toyota' } } : { details: { car: { make: 'Toyota' } } };¿Hay otros métodos?
¿Está buscando una asignación lógica nula , la forma abreviada de x = x ?? y :
(customer.details ??= {}).car = { make: 'Toyota' };También funciona bien con el encadenamiento, por ejemplo
((customer.details ??= {}).car ??= {}).make = 'Toyota';Yo prefiero:
customer.details = { ...(customer.details || {}), car: { make: 'toyota' }, }ya que implica que está "superponiendo" detalles con una nueva propiedad.
Vale la pena señalar que su ejemplo (3) no parece funcionar del todo bien. Si el cliente ya tiene un campo de detalles, todo el registro del cliente se reemplazará con { details: { car: ... } } .