Inicializar una propiedad de matriz de objetos y luego enviar valores parece ser un enfoque de dos pasos. ¿Existe un enfoque óptimo de una línea en ES6? El ejemplo del problema se encuentra en el appendError(prop, error) a continuación.
Pregunta:
¿Hay una línea o un enfoque más conciso con JS o lodash?
El futuro encadenamiento opcional parece resolver el problema, pero ¿hay una solución hoy? PHP permite $array[prop][] = val;
class Errors { constructor(fields ) { this.errors = {}; } /** * Clear one or all error fields. * * @param {string} prop | example: "email" * @param {string} error | example: "Invalid email" */ appendError(prop, error) { /* Set key and empty array if property doest exist */ if (!this.has(prop)) this.errors[prop] = []; /* then Push value */ this.errors[prop].push(error); } /** * Determine if an errors exists for the given field. * * @param {string} prop */ has(prop) { return this.errors.hasOwnProperty(prop); } }Puede usar la asignación lógica nula (??=) para asignar una matriz vacía, si el valor de la propiedad no está undefined :
(this.errors[prop] ??= []).push(error);Ejemplo:
class Errors { constructor(fields) { this.errors = {}; } appendError(prop, error) { (this.errors[prop] ??= []).push(error); } } const errors = new Errors; errors.appendError('a', 'a'); errors.appendError('a', 'b'); console.log(errors.errors);Podrías abusar || para eso:
this.errors[prop]?.push(error) || (this.errors[prop] = [error]);Podrías escribir algo como:
appendError(prop, error) { (this.error[prop] = this.error[prop]||[]) && this.error[prop].push(error) && this.error[prop]; }