Curated collection of useful Javascript snippets that you can understand in 30 seconds or less.
- Use Ctrl + F or command + F to search for a snippet.
- Contributions welcome, please read contribution guide.
- Anagrams of string (with duplicates)
- Average of array of numbers
- Bottom visible
- Capitalize first letter of every word
- Capitalize first letter
- Check for palindrome
- Count occurrences of a value in array
- Current URL
- Curry
- Deep flatten array
- Difference between arrays
- Distance between two points
- Divisible by number
- Escape regular expression
- Even or odd number
- Factorial
- Fibonacci array generator
- Filter out non uniqe values in an array
- Flatten array
- Get max value from array
- Get min value from array
- Get scroll position
- Greatest common divisor (GCD)
- Head of list
- Initial of list
- Initialize array with range
- Initialize array with values
- Last of list
- Measure time taken by function
- Object from key value pairs
- Pipe
- Powerset
- Random integer in range
- Random number in range
- Randomize order of array
- Redirect to url
- Reverse a string
- RGB to hexadecimal
- Scroll to top
- Shuffle array values
- Similarity between arrays
- Sort characters in string (alphabetical)
- Sum of array of numbers
- Swap values of two variables
- Tail of list
- Unique values of array
- URL parameters
- UUID generator
- Validate number
Use recursion.
For each letter in the given string, create all the partial anagrams for the rest of its letters.
Use map()
to combine the letter with each partial anagram, then reduce()
to combine all anagrams in one array.
Base cases are for string length
equal to 2
or 1
.
const anagrams = str => {
if(str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str];
return str.split('').reduce( (acc, letter, i) => {
anagrams(str.slice(0, i) + str.slice(i + 1)).map( val => acc.push(letter + val) );
return acc;
}, []);
}
// anagrams('abc') -> ['abc','acb','bac','bca','cab','cba']
Use reduce()
to add each value to an accumulator, initialized with a value of 0
, divide by the length
of the array.
const average = arr =>
arr.reduce( (acc , val) => acc + val, 0) / arr.length;
// average([1,2,3]) -> 2
Returns true
if bottom of the page is visible. It adds scrollY
to
the height of the visible portion of the page (clientHeight
) and
compares it to pageHeight
to see if bottom of the page is visible.
const bottomVisible = () => {
const scrollY = window.scrollY;
const visibleHeight = document.documentElement.clientHeight;
const pageHeight = document.documentElement.scrollHeight;
const bottomOfPage = visibleHeight + scrollY >= pageHeight;
return bottomOfPage || pageHeight < visibleHeight;
}
Use replace()
to match the first character of each word and toUpperCase()
to capitalize it.
const capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase());
// capitalizeEveryWord('hello world!') -> 'Hello World!'
Use slice(0,1)
and toUpperCase()
to capitalize first letter, slice(1)
to get the rest of the string.
Omit the lowerRest
parameter to keep the rest of the string intact, or set it to true
to convert to lower case.
const capitalize = (str, lowerRest = false) =>
str.slice(0, 1).toUpperCase() + (lowerRest? str.slice(1).toLowerCase() : str.slice(1));
// capitalize('myName', true) -> 'Myname'
Convert string toLowerCase()
and use replace()
to remove non-alphanumeric characters from it.
Then, split('')
into individual characters, reverse()
, join('')
and compare to the original, unreversed string, after converting it tolowerCase()
.
const palindrome = str =>
str.toLowerCase().replace(/[\W_]/g,'').split('').reverse().join('') === str.toLowerCase().replace(/[\W_]/g,'');
// palindrome('taco cat') -> true
Use reduce()
to increment a counter each time you encounter the specific value inside the array.
const countOccurrences = (arr, value) => arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0);
// countOccurrences([1,1,2,1,2,3], 1) -> 3
Use window.location.href
to get current URL.
const currentUrl = _ => window.location.href;
// currentUrl() -> 'https://google.com'
Use recursion.
If the number of provided arguments (args
) is sufficient, call the passed function f
.
Otherwise return a curried function f
that expects the rest of the arguments.
const curry = f =>
(...args) =>
args.length >= f.length ? f(...args) : (...otherArgs) => curry(f)(...args, ...otherArgs);
// curry(Math.pow)(2)(10) -> 1024
Use recursion.
Use reduce()
to get all elements that are not arrays, flatten each element that is an array.
const deepFlatten = arr =>
arr.reduce( (a, v) => a.concat( Array.isArray(v) ? deepFlatten(v) : v ), []);
// deepFlatten([1,[2],[[3],4],5]) -> [1,2,3,4,5]
Use filter()
to remove values that are part of values
, determined using includes()
.
const difference = (arr, values) => arr.filter(v => !values.includes(v));
// difference([1,2,3], [1,2]) -> [3]
Use Math.hypot()
to calculate the Euclidean distance between two points.
const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0);
// distance(1,1, 2,3) -> 2.23606797749979
Use the modulo operator (%
) to check if the remainder is equal to 0
.
const isDivisible = (dividend, divisor) => dividend % divisor === 0;
// isDivisible(6,3) -> true
Use replace()
to escape special characters.
const escapeRegExp = str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
// escapeRegExp('(test)') -> \\(test\\)
Use Math.abs()
to extend logic to negative numbers, check using the modulo (%
) operator.
Return true
if the number is even, false
if the number is odd.
const isEven = num => Math.abs(num) % 2 === 0;
// isEven(3) -> false
Use recursion.
If n
is less than or equal to 1
, return 1
.
Otherwise, return the product of n
and the factorial of n - 1
.
const factorial = n => n <= 1 ? 1 : n * factorial(n - 1);
// factorial(6) -> 720
Create an empty array of the specific length, initializing the first two values (0
and 1
).
Use Array.reduce()
to add values into the array, using the sum of the last two values, except for the first two.
const fibonacci = n =>
Array(n).fill(0).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i),[]);
// fibonacci(5) -> [0,1,1,2,3]
Use Array.filter()
for an array containing only the unique values.
const unique = arr => arr.filter(i => arr.indexOf(i) === arr.lastIndexOf(i));
// unique([1,2,2,3,4,4,5]) -> [1,3,5]
Use reduce()
to get all elements inside the array and concat()
to flatten them.
const flatten = arr => arr.reduce( (a, v) => a.concat(v), []);
// flatten([1,[2],3,4]) -> [1,2,3,4]
Use Math.max()
combined with the spread operator (...
) to get the minimum value in the array.
const arrayMax = arr => Math.max(...arr);
// arrayMax([10, 1, 5]) -> 10
Use Math.min()
combined with the spread operator (...
) to get the minimum value in the array.
const arrayMin = arr => Math.min(...arr);
// arrayMin([10, 1, 5]) -> 1
Use pageXOffset
and pageYOffset
if they are defined, otherwise scrollLeft
and scrollTop
.
You can omit el
to use a default value of window
.
const getScrollPos = (el = window) =>
( {x: (el.pageXOffset !== undefined) ? el.pageXOffset : el.scrollLeft,
y: (el.pageYOffset !== undefined) ? el.pageYOffset : el.scrollTop} );
// getScrollPos() -> {x: 0, y: 200}
Use recursion.
Base case is when y
equals 0
. In this case, return x
.
Otherwise, return the GCD of y
and the remainder of the division x/y
.
const gcd = (x , y) => !y ? x : gcd(y, x % y);
// gcd (8, 36) -> 4
Return arr[0]
.
const head = arr => arr[0];
// head([1,2,3]) -> 1
Return arr.slice(0,-1)
.
const initial = arr => arr.slice(0,-1);
// initial([1,2,3]) -> [1,2]
Use Array(end-start)
to create an array of the desired length, map()
to fill with the desired values in a range.
You can omit start
to use a default value of 0
.
const initializeArrayRange = (end, start = 0) =>
Array.apply(null, Array(end-start)).map( (v,i) => i + start );
// initializeArrayRange(5) -> [0,1,2,3,4]
Use Array(n)
to create an array of the desired length, fill(v)
to fill it with the desired values.
You can omit value
to use a default value of 0
.
const initializeArray = (n, value = 0) => Array(n).fill(value);
// initializeArray(5, 2) -> [2,2,2,2,2]
Return arr.slice(-1)[0]
.
const last = arr => arr.slice(-1)[0];
// last([1,2,3]) -> 3
Use performance.now()
to get start and end time for the function, console.log()
the time taken.
First argument is the function name, subsequent arguments are passed to the function.
const timeTaken = (func,...args) => {
var t0 = performance.now(), r = func(...args);
console.log(performance.now() - t0);
return r;
}
// timeTaken(Math.pow, 2, 10) -> 1024 (0.010000000009313226 logged in console)
Use Array.reduce()
to create and combine key-value pairs.
const objectFromPairs = arr => arr.reduce((a,v) => (a[v[0]] = v[1], a), {});
// objectFromPairs([['a',1],['b',2]]) -> {a: 1, b: 2}
Use Array.reduce()
to pass value through functions.
const pipe = (...funcs) => arg => funcs.reduce((acc, func) => func(acc), arg);
// pipe(btoa, x => x.toUpperCase())("Test") -> "VGVZDA=="
Use reduce()
combined with map()
to iterate over elements and combine into an array containing all combinations.
const powerset = arr =>
arr.reduce( (a,v) => a.concat(a.map( r => [v].concat(r) )), [[]]);
// powerset([1,2]) -> [[], [1], [2], [2,1]]
Use Math.random()
to generate a random number and map it to the desired range, using Math.floor()
to make it an integer.
const randomIntegerInRange = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
// randomIntegerInRange(0, 5) -> 2
Use Math.random()
to generate a random value, map it to the desired range using multiplication.
const randomInRange = (min, max) => Math.random() * (max - min) + min;
// randomInRange(2,10) -> 6.0211363285087005
Use sort()
to reorder elements, utilizing Math.random()
to randomize the sorting.
const randomizeOrder = arr => arr.sort( (a,b) => Math.random() >= 0.5 ? -1 : 1);
// randomizeOrder([1,2,3]) -> [1,3,2]
Use window.location.href
or window.location.replace()
to redirect to url
.
Pass a second argument to simulate a link click (true
- default) or an HTTP redirect (false
).
const redirect = (url, asLink = true) =>
asLink ? window.location.href = url : window.location.replace(url);
// redirect('https://google.com')
Use array destructuring and Array.reverse()
to reverse the order of the characters in the string.
Combine characters to get a string using join('')
.
const reverseString = str => [...str].reverse().join('');
// reverseString('foobar') -> 'raboof'
Convert given RGB parameters to hexadecimal string using bitwise left-shift operator (<<
) and toString(16)
, then padStart(6,'0')
to get a 6-digit hexadecimal value.
const rgbToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0');
// rgbToHex(255, 165, 1) -> 'ffa501'
Get distance from top using document.documentElement.scrollTop
or document.body.scrollTop
.
Scroll by a fraction of the distance from top. Use window.requestAnimationFrame()
to animate the scrolling.
const scrollToTop = _ => {
const c = document.documentElement.scrollTop || document.body.scrollTop;
if(c > 0) {
window.requestAnimationFrame(scrollToTop);
window.scrollTo(0, c - c/8);
}
}
// scrollToTop()
Create an array of random values by using Array.map()
and Math.random()
.
Use Array.sort()
to sort the elements of the original array based on the random values.
const shuffle = arr => {
let r = arr.map(Math.random);
return arr.sort((a,b) => r[a] - r[b]);
}
// shuffle([1,2,3]) -> [2, 1, 3]
Use filter()
to remove values that are not part of values
, determined using includes()
.
const similarity = (arr, values) => arr.filter(v => values.includes(v));
// similarity([1,2,3], [1,2,4]) -> [1,2]
Split the string using split('')
, sort()
utilizing localeCompare()
, recombine using join('')
.
const sortCharactersInString = str =>
str.split('').sort( (a,b) => a.localeCompare(b) ).join('');
// sortCharactersInString('cabbage') -> 'aabbceg'
Use reduce()
to add each value to an accumulator, initialized with a value of 0
.
const sum = arr => arr.reduce( (acc , val) => acc + val, 0);
// sum([1,2,3,4]) -> 10
Use array destructuring to swap values between two variables.
[varA, varB] = [varB, varA];
// [x, y] = [y, x]
Return arr.slice(1)
.
const tail = arr => arr.slice(1);
// tail([1,2,3]) -> [2,3]
Use ES6 Set
and the ...rest
operator to discard all duplicated values.
const unique = arr => [...new Set(arr)];
// unique([1,2,2,3,4,4,5]) -> [1,2,3,4,5]
Use match()
with an appropriate regular expression to get all key-value pairs, map()
them appropriately.
Combine all key-value pairs into a single object using Object.assign()
and the spread operator (...
).
Pass location.search
as the argument to apply to the current url
.
const getUrlParameters = url =>
Object.assign(...url.match(/([^?=&]+)(=([^&]*))?/g).map(m => {[f,v] = m.split('='); return {[f]:v}}));
// getUrlParameters('http://url.com/page?name=Adam&surname=Smith') -> {name: 'Adam', surname: 'Smith'}
Use crypto
API to generate a UUID, compliant with RFC4122 version 4.
const uuid = _ =>
( [1e7]+-1e3+-4e3+-8e3+-1e11 ).replace( /[018]/g, c =>
(c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
);
// uuid() -> '7982fcfe-5721-4632-bede-6000885be57d'
Use !isNaN
in combination with parseFloat()
to check if the argument is a number.
Use isFinite()
to check if the number is finite.
const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n);
// validateNumber('10') -> true
Icons made by Smashicons from www.flaticon.com is licensed by CC 3.0 BY.