-
-
Save jed/1044540 to your computer and use it in GitHub Desktop.
function(){ | |
/* Rules: | |
(1) anonymous function // make sure | |
(2) may be self-executing // to annotate | |
(3) <=140 bytes // your code | |
(4) no globals // so everyone | |
(5) MIT license // can learn | |
(6) have a good time! // from it! | |
*/} |
function(){/*Rules: (1) anonymous function (2) may be self-executing (3) <=140 bytes (4) no globals (5) MIT license (6) have a good time!*/} |
Copyright (c) 2011 YOUR_NAME_HERE, YOUR_URL_HERE | |
Permission is hereby granted, free of charge, to any person obtaining | |
a copy of this software and associated documentation files (the | |
"Software"), to deal in the Software without restriction, including | |
without limitation the rights to use, copy, modify, merge, publish, | |
distribute, sublicense, and/or sell copies of the Software, and to | |
permit persons to whom the Software is furnished to do so, subject to | |
the following conditions: | |
The above copyright notice and this permission notice shall be | |
included in all copies or substantial portions of the Software. | |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | |
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | |
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
{ | |
"name": "sample", | |
"keywords": [ "sample", "original" ] | |
} |
try it and you'll see why. ;)
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.
it may be shorter, but it's also destructive. probably not a good idea for something like unique
.
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})})
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.
Ah, well, then at least the removal of the closure should bring some less bytes.
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.
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!
[1,2,3,1].reduce((acc, item) => acc.includes(item) ? acc : acc.concat(item), [])
is simpler
Array.prototype.uniq =
Array.prototype.unique =
( () => function()
{ return [ ...new Set( this ) ] }
) ()
What about using ~ instead of <0?