So I want to filter an array of objects according to a few filters I have created:
items.filter(
(obj) =>
(!status || (obj.globalId && obj.globalId !== "")) &&
(!deletedSwitch || obj.deleted === deletedSwitch) &&
(!filteredUsername || obj.userId === userId) &&
(!filteredType || obj.type === filteredType) &&
(!filteredVariety || obj.variety === filteredVariety) &&
(!filteredSize || parseInt(obj.size) === filteredSize)
)
So as you can see, I filter the items based on a few properties. These properties are selected through a <select> component. status property used to be a boolean state where I want to check if the item has a globalId or not. However, now I want to change it in a way where I check if status is connected, then I want to filter all items that have a globalId each. But if the status is not connected, I want to filter all items that DO NOT have a globalId. How can I modify my code above to achieve this?
CodePudding user response:
Just add it with OR?
items.filter(obj =>
((status === "connected" && obj.globalId && obj.globalId !== "") ||
(status === "not connected" && !obj.globalId)) &&
(!deletedSwitch || obj.deleted === deletedSwitch) &&
(!filteredUsername || obj.userId === userId) &&
(!filteredType || obj.type === filteredType) &&
(!filteredVariety || obj.variety === filteredVariety) &&
(!filteredSize || parseInt(obj.size) === filteredSize)
CodePudding user response:
How about using a ternary (conditional expression)?
(status == "connected" ?
object.globalId && obj.globalId !== "" :
!object.globalId)
Or, if you anticipate having more status values in the future, using an object is more extensible (and it's arguably more readable in any case):
({
"connected": object.globalId && obj.globalId !== "",
"not connected": !object.globalId,
}[status])
