2

To initialize an Object array property and then push values seems to be a two step approach. Is there an optimal one line approach in ES6? Example of the issue is in the appendError(prop, error) method below.

Question:

Is there one line or more concise approach with JS or lodash?

Future optional chaining seems solve the problem, but is there a solution today? PHP allows $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);
    }
  }

3 Answers 3

2

You can use Logical nullish assignment (??=) to assign an empty array, if the property value id undefined:

(this.errors[prop] ??= []).push(error);

Example:

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);

Sign up to request clarification or add additional context in comments.

1 Comment

Ori thank you! Logical nullish assignment (??=) makes perfect sense
1

You could abuse || for that:

this.errors[prop]?.push(error) || (this.errors[prop] = [error]);

1 Comment

Thank you. Im perfectly ok using operator as it a bit based approach which works.
0

You could write something like:

appendError(prop, error) {
    (this.error[prop] = this.error[prop]||[]) && this.error[prop].push(error) && this.error[prop];
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.