Skip to content

Instantly share code, notes, and snippets.

@jed
Forked from 140bytes/LICENSE.txt
Created June 24, 2011 10:20
Show Gist options
  • Save jed/1044540 to your computer and use it in GitHub Desktop.
Save jed/1044540 to your computer and use it in GitHub Desktop.
Array.prototype.unique
function(){/******************************************************************************************************************************/}
@atk
Copy link

atk commented Jun 26, 2011

What about using ~ instead of <0?

@jed
Copy link
Author

jed commented Jun 26, 2011

try it and you'll see why. ;)

@atk
Copy link

atk commented Jun 26, 2011

Got it. Well, then how about

Array.prototype.unique=[].unique||function(a,b){for(a=this,b=a.length;b--;a.indexOf(a[b])<b&&a.splice(b,1));return a}

does not forcefully overwrite the original method and is still 3 bytes shorter.

@jed
Copy link
Author

jed commented Jun 27, 2011

it may be shorter, but it's also destructive. probably not a good idea for something like unique.

@atk
Copy link

atk commented Jun 27, 2011

A bit longer (133 chars), but not destructive:

Array.prototype.unique||(Array.prototype.unique=function(a,b){for(a=this,b=a.length;b--;a.indexOf(a[b])<b&&a.splice(b,1));return a})

Or if you want to use your filter version (even shorter), take one of the anonymous functions out of the closure:

Array.prototype.unique||(Array.prototype.unique=function(){return this.filter(function(a,b,c){return c.indexOf(a,b+1)<0})})

@jed
Copy link
Author

jed commented Jun 27, 2011

this isn't an ES5 shim, so i'm not sure we need to worry about overwriting anything. by destructive i mean that your version mutates the original array.

@atk
Copy link

atk commented Jun 27, 2011

Ah, well, then at least the removal of the closure should bring some less bytes.

@jed
Copy link
Author

jed commented Jun 27, 2011

well, given it's a bit of an expensive operation, i'd prefer the caching of the function. @WebReflection has a really good sense for that stuff.

@sichain
Copy link

sichain commented Nov 23, 2012

hi. awesome function, thanks on that!

on a = [ 1,2,3,4,3,2,1] your version returns
[4, 3, 2, 1]
which might be disappointing if we want to have the first occurrence to be first in result set

so if you do it like that
Array.prototype.unique=function(a){return function(){return this.filter(a)}}(function(a,b,c){return c.indexOf(a)==b})
it'll return
[1, 2, 3, 4]

of course it might affect performance

thanks again!

@neolectron
Copy link

[1,2,3,1].reduce((acc, item) => acc.includes(item) ? acc : acc.concat(item), [])
is simpler

Copy link

ghost commented Oct 27, 2017

Array.prototype.uniq =
Array.prototype.unique = 
  ( () => function()
    { return [ ...new Set( this ) ] } 
  ) () 

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment