I have a repetitive set of instructions that I would like to optimize. Is there a better pattern to achieve the same goal but with less repetition ?

var assigned = this.state.data ? this.state.data.assigned : 1,
delivered = this.state.data ? this.state.data.delivered : 1,
unassigned = this.state.data ? this.state.data.unassigned : 1,
pending = this.state.data ? this.state.data.pending: 1,
total = this.state.data ? this.state.data.total: 1,
failed = this.state.data ? this.state.data.failed : 1;

closed as off-topic by Toby Speight, Mast, Ludisposed, t3chb0t, Donald.McLean Feb 5 at 13:44

This question appears to be off-topic. The users who voted to close gave this specific reason:

  • "Lacks concrete context: Code Review requires concrete code from a project, with sufficient context for reviewers to understand how that code is used. Pseudocode, stub code, hypothetical code, obfuscated code, and generic best practices are outside the scope of this site." – Toby Speight, Mast, Ludisposed, t3chb0t, Donald.McLean
If this question can be reworded to fit the rules in the help center, please edit the question.

  • \$\begingroup\$ I dont think why people's are downvoting without proper explanation \$\endgroup\$ – rajesh Feb 5 at 13:34
  • \$\begingroup\$ I don't know how this lacks context. This is the code - a series of assignments that are each a ternary expression. The goal is to have this effect without being that verbose. \$\endgroup\$ – VLAZ Feb 5 at 14:22
  • \$\begingroup\$ @VLAZ It's all explained in the help center. We don't review snippets. There's a long list of reasons for that, which can all be found on meta. \$\endgroup\$ – Mast Feb 6 at 11:46
  • \$\begingroup\$ @Mast I still don't get it. As far as I can see, this example answers "yes" to each of the criteria listed. There is code, OP is presumably the author or maintainer, seems to be from an actual project, it works as intended, OP wants this to be "good code" as in improved, all facets can be discussed and I've indeed made suggestions not directly related to OP's request. Sure, it's a short code but I don't see length being mentioned. The only thing I see it maybe failing is the "Do not ask 'How do I best do X'" but if it's that reason there could have been an edit or comment. \$\endgroup\$ – VLAZ Feb 6 at 11:54
  • 1
    \$\begingroup\$ The problem is that the code is presented without context. It is hard to give the proper advice unless we see where the state values come from and how they are used. \$\endgroup\$ – 200_success Feb 6 at 18:53

First of all, you can use the OR operand. It's idiomatic to mean "either get the value of a variable or a fallback value, if falsey"

assignment = someVariable || "fallback value"

Since you're checking this.state.data every time, it's better to either check it once

const data = this.state.data || {}

and then use that

var assigned = data.assigned || 1,
    delivered = data.delivered || 1,
    unassigned = data.unassigned || 1,
    pending = data.pending || 1,
    total = data.total || 1,
    failed = data.failed || 1;

This will leave this.state.data untouched, you are just working with a different variable called data.

Alternatively, you can directly check and possibly initialise this.state.data, assuming that doesn't lead to problems with any other potential initialisation.

this.state.data = this.state.data || {}

and then you can check var assigned = this.state.data.assigned || 1 and so on.

Note that this style will give you the fallback if the current value is falsey. This includes an empty string or the number zero. If those are valid values, then you should not be using the OR operator to get them. For example, with this.state.data.failed = 0 the expression failed = this.state.data.failed || 1 will give you 1. In that case, you might need to write a custom function to get the value or get a default value. If you have Lodash, you can use _.get() for that purpose.

If you are using ES6, then this can be drastically shortened using a destructuring assignment with default values

const data = { assigned: 5, delivered: 10, total: 42 };

let { 
  assigned = 1, 
  delivered = 1, 
  unassigned = 1, 
  pending = 1, 
  total = 1, 
  failed = 1 
} = data;

console.log("assigned", assigned);
console.log("delivered", delivered);
console.log("unassigned", unassigned);
console.log("pending", pending);
console.log("total", total);
console.log("failed", failed);

  • \$\begingroup\$ It would be useful to know what is wrong with this question/answer if we are to improve them. \$\endgroup\$ – VLAZ Feb 5 at 11:56

Not the answer you're looking for? Browse other questions tagged or ask your own question.