I have this component which has been passed a parameter in its route from another component. I save the value in a cost in order to use it.
const params = useParams()
const id = params.id;
if I click on the Card component it would navigate me to a different route which has the component card details
when using console.log(id) I get the proper value.
now I have this array of objects from back-end and there is where I need the ID parameter for compare.
const [state, setState] = useState<any>(store.getState().perfumeState.perfumes);
Here is the array of perfumes which is stored in store of redux
So basically What I am trying to do is find the specific perfume object with the given ID and for that I used:
var result = state.filter(obj => {
return obj.id === id // <------- Returns `NULL` // return obj.id === 2 // <-------- Returns correct value
})
here I have an issue. while I hard-code a number I get the proper result, however, when I use the id value it returns null.
also, Instead of getting an object I get an array of one object each time.
CodePudding user response:
Route parameters from useParams always have string values (or are undefined). So if the id field on your objects has type number, then equality checks with strict equality operator (===) will never pass.
You can fix this by using either the normal equality operator (==) or by casting id (from params) to a number.
Either:
const result = state.filter(obj => obj.id == id);
or:
const result = state.filter(obj => obj.id === Number(id));
Would recommend casting to a number and keeping strict equality (especially since your eslint settings will probably warn you about using the normal equality operator).
As for getting a single object rather than an array, you can use the find method (instead of filter), which will return the first element satisfying your condition or undefined. Like this:
const result = state.find(obj => obj.id === Number(id));
