It starts with realizing that arrays are blocks of memory and that technically you are creating a new array with some of the old values as you can't update the size of an array after you create one.
So, you are copying data to a new array instead of modifying an existing one. There's no way around having to iterate over your data at least once. However, the difference is in the price of your contains operation. I suspect/hope that the set might do some optimal things here (like using a hash function). Of course then having to use the spread operation might mean you are copying twice; which is of course not ideal. Your other two options probably have O(n) complexity for the contains check.
So if you do this a lot, use a Set as your primary data structure instead of converting to and from arrays because that isn't free.
We're a place where coders share, stay up-to-date and grow their careers.
We strive for transparency and don't collect excess data.