There’s always many ways to do things. One way could be:
Use an array or json object to store a list of all the cards. In it you could store things like the name of the card, the file name of the image, and if it’s owned.
Then you could make a second list of owned cards or use find() with the name to filter the list. Basically by looping over the complete list and building the filtered list from that.
Now to display those cards you’d loop over the filtered list and create the cards and position them like dop suggests.
If looping over the lists becomes too slow you could only loop over part of the lists per frame.
You could also possibly not have to create all the cards from the filtered list to display them. Depending how you display them you could calculate what cards would be visible and only create those.
Finally if video memory becomes an issue with so many unique cards you would need to do some kind of memory management. So instead of adding all the card images to the card sprites animation, you’d add them to the files folder of your project. Then you’d load/remove the images on the fly to the card sprite as needed at runtime. It’s probably more tedious to do than it sounds. You’d want to keep track of what images were loaded to avoid repeated loading.
Anyways, that’s a fairly low level overview of what might be needed. There are probably many simplifications or shortcuts.