4 ms·
I like this bit of JavaScript for uniquifying an array: array.filter((item, index, arr) => arr.indexOf(item) === index) It works because indexOf returns the
by _bxg1 7y ago
I like this bit of JavaScript for uniquifying an array:
array.filter((item, index, arr) => arr.indexOf(item) === index)
It works because indexOf returns the index of the first occurrence of the item, so you're asking whether this occurrence is the first occurrence.
- throwaway_n 7y agoThis is O(n^2) though
- _bxg1 7y agoAll of JS's list processing functions are pretty inefficient, since at the bare minimum each one creates and copies to a new array (as opposed to, say, Rust iterators). You use them when elegance is more important than performance; N^2 is fine when N is eight.
- deleted 7y ago[deleted]
- deleted 7y ago[deleted]
- kadoban 7y agoThat's always such a dangerous proposition though. Sure _you_ remember it's only fine when N is 8, but then the next guy comes along, or the input constraints change, or future you forgets because it _is_ fairly elegant looking. I try not to leave grenades laying around too often, myself.
- superfrank 7y agoPersonally I like this one, although it only works for an array of primitive types. const unique = [...new Set(arr)];
- _bxg1 7y agoThe other advantage of the filter one is it can be stuck in the middle of a bunch of other list operations - map(), sort(), slice(), other filters(). Also, you can use findIndex() instead of indexOf() to match any arbitrary predicate, instead of exact equivalence.
- superfrank 7y agoOh, for sure. I know .filter() has it's place, so if you need anything beyond making the array unique, I'd definitely use your solution. The one I posted just blew my mind a little the first time I saw it, so I love to share it. I guess I never really considered spreading a set.
- SzamarCsacsi 7y agoI like this neat little code to filter out falsy values: array.filter(Boolean)