Dust off your ternary expressions, we're going in.
One-liners are tricky to maintain (and sometimes even hard to understand) but that doesn't stop them from being cool as hell. There's a certain satisfaction that comes after writing a terse solution.
This is a collection of some of my recent favorites. They will all run in your dev console so pop it open and try them out. I hope you'll share some of your own favorites in the comments!
Calendar Hacking
Ali Spittel tweeted this out recently. It solves a problem I've faced multiple times. If you swap the minus for a plus, it gives you the next seven days.
// Create an array of the past seven days, inclusive
[...Array(7).keys()].map(days => new Date(Date.now() - 86400000 * days));
Random ID generation
This is my go-to function for creating unique ids when prototyping. I've even seen people using it in production in the past. It's not secure but ... there are worse random generation functions out there.
// Generate a random alphanumerical string of length 11
Math.random().toString(36).substring(2);
Quines
A quine is a program that outputs its own source code. Quines have always fascinated me. I've got pretty close to completing my own quines a couple of times in different languages but details are the name of the game.
I've picked some winners for you. Credit to Mama Fun Roll, PleaseStand, and Peter Olson respectively for these three.
// $=_=>`$=${$};$()`;$()
$=_=>`$=${$};$()`;$()
// eval(I="'eval(I='+JSON.stringify(I)+')'")
eval(I="'eval(I='+JSON.stringify(I)+')'")
// For those who like their quines via alert
// (function a(){alert("("+a+")()")})()
(function a(){alert("("+a+")()")})()
Scrape query parameters
Talk about non-maintainable code. This converts the page's query parameters to an object in 78 bytes. Thanks Alex Lohr for code golfing it (and 齐翊 too).
?foo=bar&baz=bing => {foo: bar, baz: bing}
// Set the current page's query parameters to `q`
q={};location.search.replace(/([^?&=]+)=([^&]*)/g,(_,k,v)=>q[k]=v);q;
I'd like to see a minifier work that hard.
Working clock
With a sprinkle of HTML, you can create a working clock with source code you could read out in one breath. I wrote this after a challenge from a co-worker. It ticks every second, updating the page with the current time.
<body onload="setInterval(()=>document.body.innerHTML=new Date().toGMTString().slice(17,25))"></body>
Shuffle an array
Until Pythonistas show up with their import random
, random.shuffle(array)
solution, we're going to enjoy what we have. This has the bonus of having an infinitesimal chance of being an infinite loop (implementation depending). Michiel Hendriks helped us save a few characters here 👍. Don't use in production.
// Return a shuffled copy of an Array-like
(arr) => arr.slice().sort(() => Math.random() - 0.5)
Generate random hex code
ES7's padEnd is a blessing. Along with padStart
, they've made number to string conversions that much easier. Writing hex values right into JavaScript code is always pretty neat too.
// Generate a random hex code such as `#c618b2`
'#' + Math.floor(Math.random() * 0xffffff).toString(16).padEnd(6, '0');
Pass the interview in style
The infamous interview question answer but codegolfed. I researched and I don't think it can get any shorter than this.
for(i=0;++i<101;console.log(i%5?f||i:f+'Buzz'))f=i%3?'':'Fizz'
Remove duplicates
This only works with primitives but it's still nifty. Set takes any iterable object, like an array [1,2,3,3]
, and removes duplicates. The spread operator makes that set [1,2,3]
.
// Remove duplicates from the iterable `arr`
[...new Set(arr)]
A keyboard so real you can taste it
Okay, I don't really count this as a one-liner but it's too good not to include. A masterful codegolf solution by edc65. It's terse to a fault and codegolfed within an inch of its life but we should bask in its glory.
// Return a ***3D*** ASCII keyboard as string
(_=>[..."`1234567890-=~~QWERTYUIOP[]\\~ASDFGHJKL;'~~ZXCVBNM,./~"].map(x=>(o+=`/${b='_'.repeat(w=x<y?2:' 667699'[x=["BS","TAB","CAPS","ENTER"][p++]||'SHIFT',p])}\\|`,m+=y+(x+' ').slice(0,w)+y+y,n+=y+b+y+y,l+=' __'+b)[73]&&(k.push(l,m,n,o),l='',m=n=o=y),m=n=o=y='|',p=l=k=[])&&k.join`
`)()
Amazing.
Join 150+ people signed up to my newsletter on programming and personal growth!
I tweet about tech @healeycodes.
Latest comments (52)
The one I recently discovered as very useful, mostly while testing or mocking API calls:
Usually I use, when I have to simulate data fetching ;P
Very cool! Thanks for sharing Dominik 👍
Thanks! I would recommend adding most of them to vscode snippets. It's really easy to use just like typing "sleep" + enter and I have ready one-liner in my code ;)
google search got me here. Thank you for this article. This one's i've been looking for.
Now I need the bash (or if Apple forces me zsh) script so I can call the command sevenDays ;)
This article makes JavaScript look really fun to play with. Thanks Andrew!
Yeah, this one was fun to write! 😁
A couple of comments!
Anything that has semicolons in it isn't a one-liner, no matter how you try to stretch the definition.
And does it matter that days aren't always 86400000 milliseconds long?
One of the intriguing trait of functional programming is to look unreadable despite being working.
I use Set often to remove duplicates, but I didn't know it's possible to use the spread operator on a Set.
I have been using
Array.from(new Set(myArray))
until now. SinceArray.from
take an iterable I could have guessed but...Nice post !
Glad it helped ya!
great stuff
thanks
got a problem like this:
lost key 'a' and 'c'
solution: replace the 2nd '+' by '*'
Thanks! Fixed it :)
Does this count? 😈
I'll allow it! 😀
Please don't use code in production that multiplies 86400000 (24*60*60*1000) for computing dates; date/time is way more complicated than that, you will shoot yourself in the foot. Use a library.
Note that list shuffle approach has a bunch of bias and doesn't perform very good shuffling. See beesbuzz.biz/code/6719-How-not-to-... for a detailed explanation.
Yup! 😀 The function is short but scary. Raphael linked another article that covers the same topic. I'll add a note.
Be careful with that shuffle, it won’t yield truly random results because
sort
expects its comparator to upholdMath.sign(compare(a, b)) === -Math.sign(compare(b, a))
. Microsoft once screwed up by using exactly that.What an interesting story! Thanks for sharing.
And yes, for any production code just use Fisher/Yates!
I did this one for a challenge. It finds if a number is in a range of two other numbers so find if b is in range of a to c
Wouldn't you just check
b >= a && b <= c
?That was definitely a way to do it. However, I am pretty sure that only works with constraints on the range values, and the way I wanted to solve it was to be sure it could handle any range.
I could be wrong which in that case, I will certainly remember this way lol
Nope to me lol, you're just right and I am pretty sure that works for any size range not just that but the
Big O is significantly better ahahaha!