I'm looking for a better way to write the following code:
let fromCreatedAt;
let toCreatedAt = new Date();
const someObject = {
...((!!fromCreatedAt || !!toCreatedAt) ? {
createdAt: {
...(!!fromCreatedAt ? {
from: fromCreatedAt,
} : {}),
...(!!toCreatedAt ? {
to: toCreatedAt,
} : {}),
},
} : {}),
}
console.log(someObject); // { createdAt: { to: 2020-11-18T05:32:57.697Z } }
fromCreatedAt and toCreatedAt are variables that can change and generate a different object.
This is just an example, but you could have an object that repeats the conditions of the createdAt field multiple times for other fields, so you would find a way to refactor that repeated functionality.
I'd use shorthand properties to create the createdAt
nested object, removing undefined values by filtering through Object.fromEntries
. Then you can create the someObject
depending on whether the createdAt
object has any keys or not:
let from; let to = new Date(); const createdAt = Object.fromEntries( Object.entries({ from, to }).filter(([, val]) => val !== undefined) ); const someObject = Object.keys(createdAt).length ? { createdAt } : {}; console.log(someObject);
You could create objects using shorthand property name and conditionally spread it
let fromCreatedAt, toCreatedAt = new Date(), from = fromCreatedAt, to = toCreatedAt; const createdAt = { ...(from && { from }), ...(to && { to }) }, someObject = { ...(from || to && { createdAt }) } console.log(someObject)
Because ...null
and ...undefined
will cause no data properties to be copied, you could get rid of the ternary operators and simplify to boolean short-circuit evaluation:
let fromCreatedAt; let toCreatedAt = new Date(); const someObject = { ...(fromCreatedAt || toCreatedAt) && { createdAt: { ...fromCreatedAt && { from: fromCreatedAt}, ...toCreatedAt && { to: toCreatedAt}, } } }; console.log(someObject);
I thought this might be a little more elegant, but it doesn't get rid of the duplicate conditions, so probably doesn't answer the question completely.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.