How can I shorten that if else statement?
const isPathPointAvailable = (requiredItems?: ModelTypes['Item'][], oneOfItems?: ModelTypes['Item'][]) => {
if(requiredItems && requiredItems.length > 0){
return userHaveMultipleRequiredItems(requiredItems);
}
if(oneOfItems && oneOfItems.length > 0){
return userHaveRequiredItem(oneOfItems);
}
return true
I tried this but it always return true
const isPathPointAvailable = (requiredItems?: ModelTypes['Item'][], oneOfItems?: ModelTypes['Item'][]) => {
requiredItems && requiredItems.length > 0 && userHaveMultipleRequiredItems(requiredItems);
oneOfItems && oneOfItems.length > 0 && userHaveRequiredItem(oneOfItems);
return true
};
CodePudding user response:
Use the optional chaining operator ?.
to return the falsy undefined
if the arrays are not defined. length === 0
is also falsy.
const isPathPointAvailable = (requiredItems?: ModelTypes['Item'][], oneOfItems?: ModelTypes['Item'][]) => {
if(requiredItems?.length) return userHaveMultipleRequiredItems(requiredItems);
if(oneOfItems?.length) return userHaveRequiredItem(oneOfItems);
return true
You were on the right track with your second attempt, but it is missing the return statements in the shortened ifs.
CodePudding user response:
You could also just use a simple lambda to refactor those two longer checks with something like:
let isNotEmpty = (arr) => arr && arr.length > 0;
const isPathPointAvailable = (requiredItems?: ModelTypes['Item'][], oneOfItems?: ModelTypes['Item'][]) => {
if( isNotEmpty(requiredItems) ) {
return userHaveMultipleRequiredItems(requiredItems);
}
if( isNotEmpty(oneOfItems) ) {
return userHaveRequiredItem(oneOfItems);
}
return true
}
That would keep the same semantics, but having a function called isNotEmpty(...)
vs. !isEmpty(...)
is maybe not as "stylish." So if you prefer the later it would mean you'd need to invert the boolean logic:
let isEmpty = (arr) => !arr || arr.length === 0;