From 8de8fd93aa605511146ba7099861674f5383baf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 13:26:14 +0100 Subject: [PATCH 01/36] update snippet-template.md --- snippet-template.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/snippet-template.md b/snippet-template.md index f95eabc3d..c21926208 100644 --- a/snippet-template.md +++ b/snippet-template.md @@ -7,5 +7,8 @@ Explain briefly how the snippet works. ```js const functionName = arguments => {functionBody} -// functionName(sampleInput) -> sampleOutput +``` + +```js +functionName() ``` \ No newline at end of file From 9b57350525737a784787a2411d3ebd5ce24adf20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 13:59:23 +0100 Subject: [PATCH 02/36] update snippets 1-15 --- snippets/anagrams.md | 5 ++++- snippets/arrayAverage.md | 5 ++++- snippets/arrayGcd.md | 7 +++++-- snippets/arrayLcm.md | 9 ++++++--- snippets/arrayMax.md | 5 ++++- snippets/arrayMin.md | 5 ++++- snippets/arraySum.md | 5 ++++- snippets/arrayToHtmlList.md | 5 ++++- snippets/bottomVisible.md | 3 +++ snippets/call.md | 7 ++++--- snippets/capitalize.md | 7 +++++-- snippets/capitalizeEveryWord.md | 5 ++++- snippets/chainAsync.md | 5 +++-- snippets/chunk.md | 5 ++++- snippets/clampNumber.md | 15 +++++++++------ 15 files changed, 67 insertions(+), 26 deletions(-) diff --git a/snippets/anagrams.md b/snippets/anagrams.md index b89194564..2238c4a5f 100644 --- a/snippets/anagrams.md +++ b/snippets/anagrams.md @@ -13,5 +13,8 @@ const anagrams = str => { return str.split('').reduce((acc, letter, i) => acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)), []); }; -// anagrams('abc') -> ['abc','acb','bac','bca','cab','cba'] +``` + +```js +anagrams('abc') -> ['abc','acb','bac','bca','cab','cba'] ``` diff --git a/snippets/arrayAverage.md b/snippets/arrayAverage.md index 74c8cef97..92c54518b 100644 --- a/snippets/arrayAverage.md +++ b/snippets/arrayAverage.md @@ -6,5 +6,8 @@ Use `Array.reduce()` to add each value to an accumulator, initialized with a val ```js const arrayAverage = arr => arr.reduce((acc, val) => acc + val, 0) / arr.length; -// arrayAverage([1,2,3]) -> 2 +``` + +```js +arrayAverage([1,2,3]) -> 2 ``` diff --git a/snippets/arrayGcd.md b/snippets/arrayGcd.md index 39a154059..df657f31a 100644 --- a/snippets/arrayGcd.md +++ b/snippets/arrayGcd.md @@ -9,6 +9,9 @@ const arrayGcd = arr =>{ const gcd = (x, y) => !y ? x : gcd(y, x % y); return arr.reduce((a,b) => gcd(a,b)); } -// arrayGcd([1,2,3,4,5]) -> 1 -// arrayGcd([4,8,12]) -> 4 +``` + +```js +arrayGcd([1,2,3,4,5]) -> 1 +arrayGcd([4,8,12]) -> 4 ``` diff --git a/snippets/arrayLcm.md b/snippets/arrayLcm.md index 8d4e593fb..fd82831f5 100644 --- a/snippets/arrayLcm.md +++ b/snippets/arrayLcm.md @@ -7,9 +7,12 @@ Use `Array.reduce()` and the `lcm` formula (uses recursion) to calculate the low ```js const arrayLcm = arr =>{ const gcd = (x, y) => !y ? x : gcd(y, x % y); - const lcm = (x, y) => (x*y)/gcd(x, y); + const lcm = (x, y) => (x*y)/gcd(x, y); return arr.reduce((a,b) => lcm(a,b)); } -// arrayLcm([1,2,3,4,5]) -> 60 -// arrayLcm([4,8,12]) -> 24 +``` + +```js +arrayLcm([1,2,3,4,5]) -> 60 +arrayLcm([4,8,12]) -> 24 ``` diff --git a/snippets/arrayMax.md b/snippets/arrayMax.md index 0c0022996..3e1b5c5e8 100644 --- a/snippets/arrayMax.md +++ b/snippets/arrayMax.md @@ -6,5 +6,8 @@ Use `Math.max()` combined with the spread operator (`...`) to get the maximum va ```js const arrayMax = arr => Math.max(...arr); -// arrayMax([10, 1, 5]) -> 10 +``` + +```js +arrayMax([10, 1, 5]) -> 10 ``` diff --git a/snippets/arrayMin.md b/snippets/arrayMin.md index 5bdd95559..171d60977 100644 --- a/snippets/arrayMin.md +++ b/snippets/arrayMin.md @@ -6,5 +6,8 @@ Use `Math.min()` combined with the spread operator (`...`) to get the minimum va ```js const arrayMin = arr => Math.min(...arr); -// arrayMin([10, 1, 5]) -> 1 +``` + +```js +arrayMin([10, 1, 5]) -> 1 ``` diff --git a/snippets/arraySum.md b/snippets/arraySum.md index 265c7fc60..9c3178d35 100644 --- a/snippets/arraySum.md +++ b/snippets/arraySum.md @@ -6,5 +6,8 @@ Use `Array.reduce()` to add each value to an accumulator, initialized with a val ```js const arraySum = arr => arr.reduce((acc, val) => acc + val, 0); -// arraySum([1,2,3,4]) -> 10 +``` + +```js +arraySum([1,2,3,4]) -> 10 ``` diff --git a/snippets/arrayToHtmlList.md b/snippets/arrayToHtmlList.md index bf5ba5721..27a66369f 100644 --- a/snippets/arrayToHtmlList.md +++ b/snippets/arrayToHtmlList.md @@ -6,5 +6,8 @@ Use `Array.map()` and `document.querySelector()` to create a list of html tags. ```js const arrayToHtmlList = (arr, listID) => arr.map(item => document.querySelector("#"+listID).innerHTML+=`
  • ${item}
  • `); -// arrayToHtmlList(['item 1', 'item 2'],'myListID') +``` + +```js +arrayToHtmlList(['item 1', 'item 2'],'myListID') ``` diff --git a/snippets/bottomVisible.md b/snippets/bottomVisible.md index adac44881..485f1879f 100644 --- a/snippets/bottomVisible.md +++ b/snippets/bottomVisible.md @@ -7,5 +7,8 @@ Use `scrollY`, `scrollHeight` and `clientHeight` to determine if the bottom of t ```js const bottomVisible = () => document.documentElement.clientHeight + window.scrollY >= (document.documentElement.scrollHeight || document.documentElement.clientHeight); +``` + +```js // bottomVisible() -> true ``` diff --git a/snippets/call.md b/snippets/call.md index a7aec4808..e30b395e0 100644 --- a/snippets/call.md +++ b/snippets/call.md @@ -6,9 +6,10 @@ Use a closure to call a stored key with stored arguments. ```js const call = ( key, ...args ) => context => context[ key ]( ...args ); -/* +``` + +```js Promise.resolve( [ 1, 2, 3 ] ).then( call('map', x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ] const map = call.bind(null, 'map') Promise.resolve( [ 1, 2, 3 ] ).then( map( x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ] -*/ -``` +``` diff --git a/snippets/capitalize.md b/snippets/capitalize.md index d085a3034..435b69202 100644 --- a/snippets/capitalize.md +++ b/snippets/capitalize.md @@ -8,6 +8,9 @@ Omit the `lowerRest` parameter to keep the rest of the string intact, or set it ```js const capitalize = ([first,...rest], lowerRest = false) => first.toUpperCase() + (lowerRest ? rest.join('').toLowerCase() : rest.join('')); -// capitalize('myName') -> 'MyName' -// capitalize('myName', true) -> 'Myname' +``` + +```js +capitalize('fooBar') -> 'FooBar' +capitalize('fooBar', true) -> 'Foobar' ``` diff --git a/snippets/capitalizeEveryWord.md b/snippets/capitalizeEveryWord.md index bfaaf00b6..b607f8f58 100644 --- a/snippets/capitalizeEveryWord.md +++ b/snippets/capitalizeEveryWord.md @@ -6,5 +6,8 @@ Use `replace()` to match the first character of each word and `toUpperCase()` to ```js const capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase()); -// capitalizeEveryWord('hello world!') -> 'Hello World!' +``` + +```js +capitalizeEveryWord('hello world!') -> 'Hello World!' ``` diff --git a/snippets/chainAsync.md b/snippets/chainAsync.md index 66fb8a6ab..1fb4067c8 100644 --- a/snippets/chainAsync.md +++ b/snippets/chainAsync.md @@ -6,11 +6,12 @@ Loop through an array of functions containing asynchronous events, calling `next ```js const chainAsync = fns => { let curr = 0; const next = () => fns[curr++](next); next(); }; -/* +``` + +```js chainAsync([ next => { console.log('0 seconds'); setTimeout(next, 1000); }, next => { console.log('1 second'); setTimeout(next, 1000); }, next => { console.log('2 seconds'); } ]) -*/ ``` diff --git a/snippets/chunk.md b/snippets/chunk.md index 8ad2c3ced..122712351 100644 --- a/snippets/chunk.md +++ b/snippets/chunk.md @@ -9,5 +9,8 @@ If the original array can't be split evenly, the final chunk will contain the re ```js const chunk = (arr, size) => Array.from({length: Math.ceil(arr.length / size)}, (v, i) => arr.slice(i * size, i * size + size)); -// chunk([1,2,3,4,5], 2) -> [[1,2],[3,4],[5]] +``` + +```js +chunk([1,2,3,4,5], 2) -> [[1,2],[3,4],[5]] ``` diff --git a/snippets/clampNumber.md b/snippets/clampNumber.md index d1bf9d64f..907b54729 100644 --- a/snippets/clampNumber.md +++ b/snippets/clampNumber.md @@ -2,16 +2,19 @@ Clamps `num` within the inclusive `lower` and `upper` bounds. -If `lower` is greater than `upper`, swap them. -If `num` falls within the range, return `num`. +If `lower` is greater than `upper`, swap them. +If `num` falls within the range, return `num`. Otherwise, return the nearest number in the range. ```js const clampNumber = (num, lower, upper) => { if(lower > upper) upper = [lower, lower = upper][0]; - return (num>=lower && num<=upper) ? num : ((num < lower) ? lower : upper) + return (num>=lower && num<=upper) ? num : ((num < lower) ? lower : upper) } -// clampNumber(2, 3, 5) -> 3 -// clampNumber(1, -1, -5) -> -1 -// clampNumber(3, 2, 4) -> 3 +``` + +```js +clampNumber(2, 3, 5) -> 3 +clampNumber(1, -1, -5) -> -1 +clampNumber(3, 2, 4) -> 3 ``` From 823aa0c305e79a79365e9c7dd0b28d0b50c73598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 14:05:36 +0100 Subject: [PATCH 03/36] update snippets 16-31 --- snippets/cleanObj.md | 11 ++++++----- snippets/coalesce.md | 5 ++++- snippets/coalesceFactory.md | 7 +++++-- snippets/collatz.md | 7 +++++-- snippets/collectInto.md | 7 ++++--- snippets/compact.md | 5 ++++- snippets/compose.md | 5 +++-- snippets/countOccurrences.md | 5 ++++- snippets/countVowels.md | 7 +++++-- snippets/currentURL.md | 5 ++++- snippets/curry.md | 7 +++++-- snippets/deepFlatten.md | 5 ++++- snippets/detectDeviceType.md | 7 +++++-- snippets/difference.md | 5 ++++- snippets/differenceWith.md | 5 ++++- 15 files changed, 66 insertions(+), 27 deletions(-) diff --git a/snippets/cleanObj.md b/snippets/cleanObj.md index f2a915719..b8377fd0d 100644 --- a/snippets/cleanObj.md +++ b/snippets/cleanObj.md @@ -15,9 +15,10 @@ const cleanObj = (obj, keysToKeep = [], childIndicator) => { } }) } -/* - const testObj = {a: 1, b: 2, children: {a: 1, b: 2}} - cleanObj(testObj, ["a"],"children") - console.log(testObj)// { a: 1, children : { a: 1}} -*/ +``` + +```js +const testObj = {a: 1, b: 2, children: {a: 1, b: 2}} +cleanObj(testObj, ["a"],"children") +console.log(testObj) // { a: 1, children : { a: 1}} ``` diff --git a/snippets/coalesce.md b/snippets/coalesce.md index 22271dc68..9762a363f 100644 --- a/snippets/coalesce.md +++ b/snippets/coalesce.md @@ -6,5 +6,8 @@ Use `Array.find()` to return the first non `null`/`undefined` argument. ```js const coalesce = (...args) => args.find(_ => ![undefined, null].includes(_)) -// coalesce(null,undefined,"",NaN, "Waldo") -> "" +``` + +```js +coalesce(null,undefined,"",NaN, "Waldo") -> "" ``` diff --git a/snippets/coalesceFactory.md b/snippets/coalesceFactory.md index 4b9a78924..39bb98714 100644 --- a/snippets/coalesceFactory.md +++ b/snippets/coalesceFactory.md @@ -6,6 +6,9 @@ Use `Array.find()` to return the first argument that returns `true` from the pro ```js const coalesceFactory = valid => (...args) => args.find(valid); -// const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_)) -// customCoalesce(undefined, null, NaN, "", "Waldo") //-> "Waldo" +``` + +```js +const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_)) +customCoalesce(undefined, null, NaN, "", "Waldo") // "Waldo" ``` diff --git a/snippets/collatz.md b/snippets/collatz.md index 8b8903886..fc05b2a5d 100644 --- a/snippets/collatz.md +++ b/snippets/collatz.md @@ -6,6 +6,9 @@ If `n` is even, return `n/2`. Otherwise, return `3n+1`. ```js const collatz = n => (n % 2 == 0) ? (n / 2) : (3 * n + 1); -// collatz(8) --> 4 -// collatz(5) --> 16 +``` + +```js +collatz(8) -> 4 +collatz(5) -> 16 ``` diff --git a/snippets/collectInto.md b/snippets/collectInto.md index c9a823d3d..141a13fa2 100644 --- a/snippets/collectInto.md +++ b/snippets/collectInto.md @@ -6,11 +6,12 @@ Given a function, return a closure that collects all inputs into an array-accept ```js const collectInto = fn => ( ...args ) => fn( args ); -/* +``` + +```js const Pall = collectInto( Promise.all.bind(Promise) ) let p1 = Promise.resolve(1) let p2 = Promise.resolve(2) let p3 = new Promise((resolve) => setTimeout(resolve,2000,3)) Pall(p1, p2, p3).then(console.log) -*/ -``` +``` diff --git a/snippets/compact.md b/snippets/compact.md index d09160afe..2a9528772 100644 --- a/snippets/compact.md +++ b/snippets/compact.md @@ -6,5 +6,8 @@ Use `Array.filter()` to filter out falsey values (`false`, `null`, `0`, `""`, `u ```js const compact = arr => arr.filter(Boolean); -// compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) -> [ 1, 2, 3, 'a', 's', 34 ] +``` + +```js +compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) -> [ 1, 2, 3, 'a', 's', 34 ] ``` diff --git a/snippets/compose.md b/snippets/compose.md index f6b1ce2ea..dfd40f814 100644 --- a/snippets/compose.md +++ b/snippets/compose.md @@ -7,10 +7,11 @@ The last (rightmost) function can accept one or more arguments; the remaining fu ```js const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args))); -/* +``` + +```js const add5 = x => x + 5 const multiply = (x, y) => x * y const multiplyAndAdd5 = compose(add5, multiply) multiplyAndAdd5(5, 2) -> 15 -*/ ``` diff --git a/snippets/countOccurrences.md b/snippets/countOccurrences.md index f55de0a62..2c1463b02 100644 --- a/snippets/countOccurrences.md +++ b/snippets/countOccurrences.md @@ -6,5 +6,8 @@ Use `Array.reduce()` to increment a counter each time you encounter the specific ```js const countOccurrences = (arr, value) => arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0); -// countOccurrences([1,1,2,1,2,3], 1) -> 3 +``` + +```js +countOccurrences([1,1,2,1,2,3], 1) -> 3 ``` diff --git a/snippets/countVowels.md b/snippets/countVowels.md index c91f09442..47c683eb8 100644 --- a/snippets/countVowels.md +++ b/snippets/countVowels.md @@ -6,6 +6,9 @@ Use a regular expression to count the number of vowels `(A, E, I, O, U)` in a `s ```js const countVowels = str => (str.match(/[aeiou]/ig) || []).length; -// countVowels('foobar') -> 3 -// countVowels('gym') -> 0 +``` + +```js +countVowels('foobar') -> 3 +countVowels('gym') -> 0 ``` diff --git a/snippets/currentURL.md b/snippets/currentURL.md index a6482a689..7e8965d92 100644 --- a/snippets/currentURL.md +++ b/snippets/currentURL.md @@ -6,5 +6,8 @@ Use `window.location.href` to get current URL. ```js const currentURL = () => window.location.href; -// currentUrl() -> 'https://google.com' +``` + +```js +currentUrl() -> 'https://google.com' ``` diff --git a/snippets/curry.md b/snippets/curry.md index c88e3418a..f1806d395 100644 --- a/snippets/curry.md +++ b/snippets/curry.md @@ -12,6 +12,9 @@ const curry = (fn, arity = fn.length, ...args) => arity <= args.length ? fn(...args) : curry.bind(null, fn, arity, ...args); -// curry(Math.pow)(2)(10) -> 1024 -// curry(Math.min, 3)(10)(50)(2) -> 2 +``` + +```js +curry(Math.pow)(2)(10) -> 1024 +curry(Math.min, 3)(10)(50)(2) -> 2 ``` diff --git a/snippets/deepFlatten.md b/snippets/deepFlatten.md index c6f29fb9b..cea888992 100644 --- a/snippets/deepFlatten.md +++ b/snippets/deepFlatten.md @@ -8,5 +8,8 @@ Recursively flatten each element that is an array. ```js const deepFlatten = arr => [].concat(...arr.map(v => Array.isArray(v) ? deepFlatten(v) : v)); -// deepFlatten([1,[2],[[3],4],5]) -> [1,2,3,4,5] +``` + +```js +deepFlatten([1,[2],[[3],4],5]) -> [1,2,3,4,5] ``` diff --git a/snippets/detectDeviceType.md b/snippets/detectDeviceType.md index b2822a458..64888d44e 100644 --- a/snippets/detectDeviceType.md +++ b/snippets/detectDeviceType.md @@ -6,6 +6,9 @@ Use a regular expression to test the `navigator.userAgent` property to figure ou ```js const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? "Mobile" : "Desktop"; -// detectDeviceType() -> "Mobile" -// detectDeviceType() -> "Desktop" +``` + +```js +detectDeviceType() -> "Mobile" +detectDeviceType() -> "Desktop" ``` diff --git a/snippets/difference.md b/snippets/difference.md index e78a73340..dce891e60 100644 --- a/snippets/difference.md +++ b/snippets/difference.md @@ -6,5 +6,8 @@ Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values no ```js const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); }; -// difference([1,2,3], [1,2,4]) -> [3] +``` + +```js +difference([1,2,3], [1,2,4]) -> [3] ``` diff --git a/snippets/differenceWith.md b/snippets/differenceWith.md index ba4aac0ec..c199a62bd 100644 --- a/snippets/differenceWith.md +++ b/snippets/differenceWith.md @@ -6,5 +6,8 @@ Use `Array.filter()` and `Array.find()` to find the appropriate values. ```js const differenceWith = (arr, val, comp) => arr.filter(a => !val.find(b => comp(a, b))) -// differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) -> [1, 1.2] +``` + +```js +differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) -> [1, 1.2] ``` From 62618883bfa716316c38a756bd4d221eb2e8945e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 14:10:38 +0100 Subject: [PATCH 04/36] update snippets 32-47 --- snippets/digitize.md | 5 ++++- snippets/distance.md | 5 ++++- snippets/distinctValuesOfArray.md | 5 ++++- snippets/dropElements.md | 5 ++++- snippets/dropRight.md | 9 ++++++--- snippets/elementIsVisibleInViewport.md | 9 ++++++--- snippets/escapeRegExp.md | 5 ++++- snippets/everyNth.md | 5 ++++- snippets/extendHex.md | 7 +++++-- snippets/factorial.md | 5 ++++- snippets/fibonacci.md | 5 ++++- snippets/fibonacciCountUntilNum.md | 5 ++++- snippets/fibonacciUntilNum.md | 5 ++++- snippets/filterNonUnique.md | 5 ++++- snippets/flatten.md | 5 ++++- 15 files changed, 65 insertions(+), 20 deletions(-) diff --git a/snippets/digitize.md b/snippets/digitize.md index f856c8369..b9d6cffbd 100644 --- a/snippets/digitize.md +++ b/snippets/digitize.md @@ -7,5 +7,8 @@ Use `Array.map()` and `parseInt()` to transform each value to an integer. ```js const digitize = n => [...''+n].map(i => parseInt(i)); -// digitize(2334) -> [2, 3, 3, 4] +``` + +```js +differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) -> [1, 1.2] ``` diff --git a/snippets/distance.md b/snippets/distance.md index 5595ef188..543c763a6 100644 --- a/snippets/distance.md +++ b/snippets/distance.md @@ -6,5 +6,8 @@ Use `Math.hypot()` to calculate the Euclidean distance between two points. ```js const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0); -// distance(1,1, 2,3) -> 2.23606797749979 +``` + +```js +distance(1,1, 2,3) -> 2.23606797749979 ``` diff --git a/snippets/distinctValuesOfArray.md b/snippets/distinctValuesOfArray.md index 24c0c60c0..374e24cef 100644 --- a/snippets/distinctValuesOfArray.md +++ b/snippets/distinctValuesOfArray.md @@ -6,5 +6,8 @@ Use ES6 `Set` and the `...rest` operator to discard all duplicated values. ```js const distinctValuesOfArray = arr => [...new Set(arr)]; -// distinctValuesOfArray([1,2,2,3,4,4,5]) -> [1,2,3,4,5] +``` + +```js +distinctValuesOfArray([1,2,2,3,4,4,5]) -> [1,2,3,4,5] ``` diff --git a/snippets/dropElements.md b/snippets/dropElements.md index adc81d79d..064a16d22 100644 --- a/snippets/dropElements.md +++ b/snippets/dropElements.md @@ -10,5 +10,8 @@ const dropElements = (arr, func) => { while (arr.length > 0 && !func(arr[0])) arr = arr.slice(1); return arr; }; -// dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4] +``` + +```js +dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4] ``` diff --git a/snippets/dropRight.md b/snippets/dropRight.md index a39613a14..11d30d198 100644 --- a/snippets/dropRight.md +++ b/snippets/dropRight.md @@ -6,7 +6,10 @@ Use `Array.slice()` to slice the remove the specified number of elements from th ```js const dropRight = (arr, n = 1) => arr.slice(0, -n); -//dropRight([1,2,3]) -> [1,2] -//dropRight([1,2,3], 2) -> [1] -//dropRight([1,2,3], 42) -> [] +``` + +```js +dropRight([1,2,3]) -> [1,2] +dropRight([1,2,3], 2) -> [1] +dropRight([1,2,3], 42) -> [] ``` diff --git a/snippets/elementIsVisibleInViewport.md b/snippets/elementIsVisibleInViewport.md index 01015d4fc..83e6afe71 100644 --- a/snippets/elementIsVisibleInViewport.md +++ b/snippets/elementIsVisibleInViewport.md @@ -16,7 +16,10 @@ const elementIsVisibleInViewport = (el, partiallyVisible = false) => { ((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth)) : top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth; }; -// e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10} -// elementIsVisibleInViewport(el) -> false (not fully visible) -// elementIsVisibleInViewport(el, true) -> true (partially visible) +``` + +```js +// e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10} +elementIsVisibleInViewport(el) -> false // (not fully visible) +elementIsVisibleInViewport(el, true) -> true // (partially visible) ``` diff --git a/snippets/escapeRegExp.md b/snippets/escapeRegExp.md index caed74069..7fdbff462 100644 --- a/snippets/escapeRegExp.md +++ b/snippets/escapeRegExp.md @@ -6,5 +6,8 @@ Use `replace()` to escape special characters. ```js const escapeRegExp = str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); -// escapeRegExp('(test)') -> \\(test\\) +``` + +```js +escapeRegExp('(test)') -> \\(test\\) ``` diff --git a/snippets/everyNth.md b/snippets/everyNth.md index f326ebe2b..6aa78ac69 100644 --- a/snippets/everyNth.md +++ b/snippets/everyNth.md @@ -6,5 +6,8 @@ Use `Array.filter()` to create a new array that contains every nth element of a ```js const everyNth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1); -// everyNth([1,2,3,4,5,6], 2) -> [ 2, 4, 6 ] +``` + +```js +everyNth([1,2,3,4,5,6], 2) -> [ 2, 4, 6 ] ``` diff --git a/snippets/extendHex.md b/snippets/extendHex.md index 8c7773c5e..9338fb139 100644 --- a/snippets/extendHex.md +++ b/snippets/extendHex.md @@ -7,6 +7,9 @@ Use `Array.map()`, `split()` and `Array.join()` to join the mapped array for con ```js const extendHex = shortHex => '#' + shortHex.slice(shortHex.startsWith('#') ? 1 : 0).split('').map(x => x+x).join('') -// extendHex('#03f') -> '#0033ff' -// extendHex('05a') -> '#0055aa' +``` + +```js +extendHex('#03f') -> '#0033ff' +extendHex('05a') -> '#0055aa' ``` diff --git a/snippets/factorial.md b/snippets/factorial.md index aaedd7520..f4f4ad941 100644 --- a/snippets/factorial.md +++ b/snippets/factorial.md @@ -11,5 +11,8 @@ Throws an exception if `n` is a negative number. const factorial = n => n < 0 ? (() => { throw new TypeError('Negative numbers are not allowed!') })() : n <= 1 ? 1 : n * factorial(n - 1); -// factorial(6) -> 720 +``` + +```js +factorial(6) -> 720 ``` diff --git a/snippets/fibonacci.md b/snippets/fibonacci.md index e5e2e15fd..9addac34a 100644 --- a/snippets/fibonacci.md +++ b/snippets/fibonacci.md @@ -8,5 +8,8 @@ Use `Array.reduce()` to add values into the array, using the sum of the last two ```js const fibonacci = n => Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []); -// fibonacci(5) -> [0,1,1,2,3] +``` + +```js +factorial(6) -> 720 ``` diff --git a/snippets/fibonacciCountUntilNum.md b/snippets/fibonacciCountUntilNum.md index 12fffbfb6..82f53ea98 100644 --- a/snippets/fibonacciCountUntilNum.md +++ b/snippets/fibonacciCountUntilNum.md @@ -7,5 +7,8 @@ Use a mathematical formula to calculate the number of fibonacci numbers until `n ```js const fibonacciCountUntilNum = num => Math.ceil(Math.log(num * Math.sqrt(5) + 1/2) / Math.log((Math.sqrt(5)+1)/2)); -// fibonacciCountUntilNum(10) -> 7 +``` + +```js +fibonacciCountUntilNum(10) -> 7 ``` diff --git a/snippets/fibonacciUntilNum.md b/snippets/fibonacciUntilNum.md index 55df575d0..c7ad1cd6e 100644 --- a/snippets/fibonacciUntilNum.md +++ b/snippets/fibonacciUntilNum.md @@ -11,5 +11,8 @@ const fibonacciUntilNum = num => { let n = Math.ceil(Math.log(num * Math.sqrt(5) + 1/2) / Math.log((Math.sqrt(5)+1)/2)); return Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []); } -// fibonacciUntilNum(15) -> [0,1,1,2,3,5,8,13] +``` + +```js +fibonacciCountUntilNum(10) -> 7 ``` diff --git a/snippets/filterNonUnique.md b/snippets/filterNonUnique.md index 059d79aa5..1568afbf8 100644 --- a/snippets/filterNonUnique.md +++ b/snippets/filterNonUnique.md @@ -6,5 +6,8 @@ Use `Array.filter()` for an array containing only the unique values. ```js const filterNonUnique = arr => arr.filter(i => arr.indexOf(i) === arr.lastIndexOf(i)); -// filterNonUnique([1,2,2,3,4,4,5]) -> [1,3,5] +``` + +```js +filterNonUnique([1,2,2,3,4,4,5]) -> [1,3,5] ``` diff --git a/snippets/flatten.md b/snippets/flatten.md index f070f2cae..66b5b86ad 100644 --- a/snippets/flatten.md +++ b/snippets/flatten.md @@ -6,5 +6,8 @@ Use a new array and concatenate it with the spread input array causing a shallow ```js const flatten = arr => [ ].concat( ...arr ); -// flatten([1,[2],3,4]) -> [1,2,3,4] +``` + +```js +flatten([1,[2],3,4]) -> [1,2,3,4] ``` From 700e6edfe759be4f5b4e798b0d3835d7c0326868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 14:16:05 +0100 Subject: [PATCH 05/36] update snippets 47-62 --- snippets/flattenDepth.md | 5 ++++- snippets/flip.md | 5 +++-- snippets/fromCamelCase.md | 9 ++++++--- snippets/functionName.md | 5 ++++- snippets/gcd.md | 5 ++++- snippets/getDaysDiffBetweenDates.md | 5 ++++- snippets/getScrollPosition.md | 5 ++++- snippets/getType.md | 5 ++++- snippets/getURLParameters.md | 5 ++++- snippets/groupBy.md | 7 +++++-- snippets/hammingDistance.md | 5 ++++- snippets/head.md | 5 ++++- snippets/hexToRGB.md | 10 ++++++---- snippets/initial.md | 5 ++++- snippets/initialize2DArray.md | 5 ++++- 15 files changed, 64 insertions(+), 22 deletions(-) diff --git a/snippets/flattenDepth.md b/snippets/flattenDepth.md index c07b837ff..6034b9135 100644 --- a/snippets/flattenDepth.md +++ b/snippets/flattenDepth.md @@ -11,5 +11,8 @@ Omit the second element, `depth` to flatten only to a depth of `1` (single flatt const flattenDepth = (arr, depth = 1) => depth != 1 ? arr.reduce((a, v) => a.concat(Array.isArray(v) ? flattenDepth(v, depth - 1) : v), []) : arr.reduce((a, v) => a.concat(v), []); -// flattenDepth([1,[2],[[[3],4],5]], 2) -> [1,2,[3],4,5] +``` + +```js +flatten([1,[2],3,4]) -> [1,2,3,4] ``` diff --git a/snippets/flip.md b/snippets/flip.md index 34a7d1f3b..a6ac82d15 100644 --- a/snippets/flip.md +++ b/snippets/flip.md @@ -6,7 +6,9 @@ Return a closure that takes variadic inputs, and splices the last argument to ma ```js const flip = fn => (...args) => fn(args.pop(), ...args) -/* +``` + +```js let a = {name: 'John Smith'} let b = {} const mergeFrom = flip(Object.assign) @@ -14,5 +16,4 @@ let mergePerson = mergeFrom.bind(null, a) mergePerson(b) // == b b = {} Object.assign(b, a) // == b -*/ ``` diff --git a/snippets/fromCamelCase.md b/snippets/fromCamelCase.md index 3d480dc85..14c21bc4c 100644 --- a/snippets/fromCamelCase.md +++ b/snippets/fromCamelCase.md @@ -9,7 +9,10 @@ Omit the second argument to use a default separator of `_`. const fromCamelCase = (str, separator = '_') => str.replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2') .replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + separator + '$2').toLowerCase(); -// fromCamelCase('someDatabaseFieldName', ' ') -> 'some database field name' -// fromCamelCase('someLabelThatNeedsToBeCamelized', '-') -> 'some-label-that-needs-to-be-camelized' -// fromCamelCase('someJavascriptProperty', '_') -> 'some_javascript_property' +``` + +```js +fromCamelCase('someDatabaseFieldName', ' ') -> 'some database field name' +fromCamelCase('someLabelThatNeedsToBeCamelized', '-') -> 'some-label-that-needs-to-be-camelized' +fromCamelCase('someJavascriptProperty', '_') -> 'some_javascript_property' ``` diff --git a/snippets/functionName.md b/snippets/functionName.md index 54603d39c..1ad25772a 100644 --- a/snippets/functionName.md +++ b/snippets/functionName.md @@ -6,5 +6,8 @@ Use `console.debug()` and the `name` property of the passed method to log the me ```js const functionName = fn => (console.debug(fn.name), fn); -// functionName(Math.max) -> max (logged in debug channel of console) +``` + +```js +functionName(Math.max) -> max (logged in debug channel of console) ``` diff --git a/snippets/gcd.md b/snippets/gcd.md index 34fb21833..8affada12 100644 --- a/snippets/gcd.md +++ b/snippets/gcd.md @@ -8,5 +8,8 @@ Otherwise, return the GCD of `y` and the remainder of the division `x/y`. ```js const gcd = (x, y) => !y ? x : gcd(y, x % y); -// gcd (8, 36) -> 4 +``` + +```js +gcd (8, 36) -> 4 ``` diff --git a/snippets/getDaysDiffBetweenDates.md b/snippets/getDaysDiffBetweenDates.md index 3b63440c1..6c73366ac 100644 --- a/snippets/getDaysDiffBetweenDates.md +++ b/snippets/getDaysDiffBetweenDates.md @@ -6,5 +6,8 @@ Calculate the difference (in days) between two `Date` objects. ```js const getDaysDiffBetweenDates = (dateInitial, dateFinal) => (dateFinal - dateInitial) / (1000 * 3600 * 24); -// getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) -> 9 +``` + +```js +getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) -> 9 ``` diff --git a/snippets/getScrollPosition.md b/snippets/getScrollPosition.md index b51ec3241..2708210a1 100644 --- a/snippets/getScrollPosition.md +++ b/snippets/getScrollPosition.md @@ -9,5 +9,8 @@ You can omit `el` to use a default value of `window`. const getScrollPosition = (el = window) => ({x: (el.pageXOffset !== undefined) ? el.pageXOffset : el.scrollLeft, y: (el.pageYOffset !== undefined) ? el.pageYOffset : el.scrollTop}); -// getScrollPosition() -> {x: 0, y: 200} +``` + +```js +getScrollPosition() -> {x: 0, y: 200} ``` diff --git a/snippets/getType.md b/snippets/getType.md index 53f660420..f0b9be8d5 100644 --- a/snippets/getType.md +++ b/snippets/getType.md @@ -7,5 +7,8 @@ Returns lowercased constructor name of value, "undefined" or "null" if value is ```js const getType = v => v === undefined ? 'undefined' : v === null ? 'null' : v.constructor.name.toLowerCase(); -// getType(new Set([1,2,3])) -> "set" +``` + +```js +getType(new Set([1,2,3])) -> "set" ``` diff --git a/snippets/getURLParameters.md b/snippets/getURLParameters.md index 77dddd532..5f4690bfc 100644 --- a/snippets/getURLParameters.md +++ b/snippets/getURLParameters.md @@ -10,5 +10,8 @@ const getURLParameters = url => url.match(/([^?=&]+)(=([^&]*))/g).reduce( (a, v) => (a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1), a), {} ); -// getURLParameters('http://url.com/page?name=Adam&surname=Smith') -> {name: 'Adam', surname: 'Smith'} +``` + +```js +getURLParameters('http://url.com/page?name=Adam&surname=Smith') -> {name: 'Adam', surname: 'Smith'} ``` diff --git a/snippets/groupBy.md b/snippets/groupBy.md index d83795fdc..4b301e2b8 100644 --- a/snippets/groupBy.md +++ b/snippets/groupBy.md @@ -9,6 +9,9 @@ Use `Array.reduce()` to create an object, where the keys are produced from the m const groupBy = (arr, func) => arr.map(typeof func === 'function' ? func : val => val[func]) .reduce((acc, val, i) => { acc[val] = (acc[val] || []).concat(arr[i]); return acc; }, {}); -// groupBy([6.1, 4.2, 6.3], Math.floor) -> {4: [4.2], 6: [6.1, 6.3]} -// groupBy(['one', 'two', 'three'], 'length') -> {3: ['one', 'two'], 5: ['three']} +``` + +```js +groupBy([6.1, 4.2, 6.3], Math.floor) -> {4: [4.2], 6: [6.1, 6.3]} +groupBy(['one', 'two', 'three'], 'length') -> {3: ['one', 'two'], 5: ['three']} ``` diff --git a/snippets/hammingDistance.md b/snippets/hammingDistance.md index 97c08d2aa..e0f22dba7 100644 --- a/snippets/hammingDistance.md +++ b/snippets/hammingDistance.md @@ -8,5 +8,8 @@ Count and return the number of `1`s in the string, using `match(/1/g)`. ```js const hammingDistance = (num1, num2) => ((num1 ^ num2).toString(2).match(/1/g) || '').length; -// hammingDistance(2,3) -> 1 +``` + +```js +hammingDistance(2,3) -> 1 ``` diff --git a/snippets/head.md b/snippets/head.md index ece926a50..30b8951a6 100644 --- a/snippets/head.md +++ b/snippets/head.md @@ -6,5 +6,8 @@ Use `arr[0]` to return the first element of the passed array. ```js const head = arr => arr[0]; -// head([1,2,3]) -> 1 +``` + +```js +head([1,2,3]) -> 1 ``` diff --git a/snippets/hexToRGB.md b/snippets/hexToRGB.md index 66c95fd3a..d3fab8a8d 100644 --- a/snippets/hexToRGB.md +++ b/snippets/hexToRGB.md @@ -16,8 +16,10 @@ const hexToRGB = hex => { + ((h & (alpha ? 0x0000ff00 : 0x0000ff)) >>> (alpha ? 8 : 0)) + (alpha ? `, ${(h & 0x000000ff)}` : '') + ')'; }; -// hexToRGB('#27ae60ff') -> 'rgba(39, 174, 96, 255)' -// hexToRGB('27ae60') -> 'rgb(39, 174, 96)' -// hexToRGB('#fff') -> 'rgb(255, 255, 255)' - +``` + +```js +hexToRGB('#27ae60ff') -> 'rgba(39, 174, 96, 255)' +hexToRGB('27ae60') -> 'rgb(39, 174, 96)' +hexToRGB('#fff') -> 'rgb(255, 255, 255)' ``` diff --git a/snippets/initial.md b/snippets/initial.md index 7b1c5c68c..87827c437 100644 --- a/snippets/initial.md +++ b/snippets/initial.md @@ -6,5 +6,8 @@ Use `arr.slice(0,-1)` to return all but the last element of the array. ```js const initial = arr => arr.slice(0, -1); -// initial([1,2,3]) -> [1,2] +``` + +```js +initial([1,2,3]) -> [1,2] ``` diff --git a/snippets/initialize2DArray.md b/snippets/initialize2DArray.md index 0cb1df126..ec7bf7681 100644 --- a/snippets/initialize2DArray.md +++ b/snippets/initialize2DArray.md @@ -6,5 +6,8 @@ Use `Array.map()` to generate h rows where each is a new array of size w initial ```js const initialize2DArray = (w, h, val = null) => Array(h).fill().map(() => Array(w).fill(val)); -// initializeArrayWithRange(2, 2, 0) -> [[0,0], [0,0]] +``` + +```js +initializeArrayWithRange(2, 2, 0) -> [[0,0], [0,0]] ``` From 038df28ca56fd49734bccf71e8a17cb33c35d64f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 14:23:06 +0100 Subject: [PATCH 06/36] update snippets 62-78 --- snippets/JSONToDate.md | 5 ++++- snippets/inRange.md | 13 ++++++++----- snippets/initialize2DArray.md | 2 +- snippets/initializeArrayWithRange.md | 9 ++++++--- snippets/initializeArrayWithValues.md | 5 ++++- snippets/intersection.md | 5 ++++- snippets/isArmstrongNumber.md | 11 +++++++---- snippets/isArray.md | 7 +++++-- snippets/isBoolean.md | 7 +++++-- snippets/isDivisible.md | 5 ++++- snippets/isEven.md | 5 ++++- snippets/isFunction.md | 7 +++++-- snippets/isNumber.md | 7 +++++-- snippets/isPrime.md | 9 ++++++--- snippets/isString.md | 7 +++++-- snippets/isSymbol.md | 7 +++++-- 16 files changed, 78 insertions(+), 33 deletions(-) diff --git a/snippets/JSONToDate.md b/snippets/JSONToDate.md index c5fa32175..38e9219f9 100644 --- a/snippets/JSONToDate.md +++ b/snippets/JSONToDate.md @@ -9,5 +9,8 @@ const JSONToDate = arr => { const dt = new Date(parseInt(arr.toString().substr(6))); return `${ dt.getDate() }/${ dt.getMonth() + 1 }/${ dt.getFullYear() }` }; -// JSONToDate(/Date(1489525200000)/) -> "14/3/2017" +``` + +```js +JSONToDate(/Date(1489525200000)/) -> "14/3/2017" ``` diff --git a/snippets/inRange.md b/snippets/inRange.md index 5089393dc..f4caf811c 100644 --- a/snippets/inRange.md +++ b/snippets/inRange.md @@ -1,6 +1,6 @@ ### inRange -Checks if the given number falls within the given range. +Checks if the given number falls within the given range. Use arithmetic comparison to check if the given number is in the specified range. If the second parameter, `end`, is not specified, the range is considered to be from `0` to `start`. @@ -10,8 +10,11 @@ const inRange = (n, start, end=null) => { if(end && start > end) end = [start, start=end][0]; return (end == null) ? (n>=0 && n=start && n true -// inRange(3, 4) -> true -// inRange(2, 3, 5) -> false -// inrange(3, 2) -> false +``` + +```js +inRange(3, 2, 5) -> true +inRange(3, 4) -> true +inRange(2, 3, 5) -> false +inrange(3, 2) -> false ``` diff --git a/snippets/initialize2DArray.md b/snippets/initialize2DArray.md index ec7bf7681..add743115 100644 --- a/snippets/initialize2DArray.md +++ b/snippets/initialize2DArray.md @@ -9,5 +9,5 @@ const initialize2DArray = (w, h, val = null) => Array(h).fill().map(() => Array( ``` ```js -initializeArrayWithRange(2, 2, 0) -> [[0,0], [0,0]] +initialize2DArray(2, 2, 0) -> [[0,0], [0,0]] ``` diff --git a/snippets/initializeArrayWithRange.md b/snippets/initializeArrayWithRange.md index c3ef5a0a0..8ea87a9c4 100644 --- a/snippets/initializeArrayWithRange.md +++ b/snippets/initializeArrayWithRange.md @@ -6,8 +6,11 @@ Use `Array((end + 1) - start)` to create an array of the desired length, `Array. You can omit `start` to use a default value of `0`. ```js -const initializeArrayWithRange = (end, start = 0) => +const initializeArrayWithRange = (end, start = 0) => Array.from({ length: (end + 1) - start }).map((v, i) => i + start); -// initializeArrayWithRange(5) -> [0,1,2,3,4,5] -// initializeArrayWithRange(7, 3) -> [3,4,5,6,7] +``` + +```js +initializeArrayWithRange(5) -> [0,1,2,3,4,5] +initializeArrayWithRange(7, 3) -> [3,4,5,6,7] ``` diff --git a/snippets/initializeArrayWithValues.md b/snippets/initializeArrayWithValues.md index 47459fcdd..a92a09e7a 100644 --- a/snippets/initializeArrayWithValues.md +++ b/snippets/initializeArrayWithValues.md @@ -7,5 +7,8 @@ You can omit `value` to use a default value of `0`. ```js const initializeArrayWithValues = (n, value = 0) => Array(n).fill(value); -// initializeArrayWithValues(5, 2) -> [2,2,2,2,2] +``` + +```js +initializeArrayWithValues(5, 2) -> [2,2,2,2,2] ``` diff --git a/snippets/intersection.md b/snippets/intersection.md index 1c367cd92..0596a04ce 100644 --- a/snippets/intersection.md +++ b/snippets/intersection.md @@ -6,5 +6,8 @@ Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values co ```js const intersection = (a, b) => { const s = new Set(b); return a.filter(x => s.has(x)); }; -// intersection([1,2,3], [4,3,2]) -> [2,3] +``` + +```js +intersection([1,2,3], [4,3,2]) -> [2,3] ``` diff --git a/snippets/isArmstrongNumber.md b/snippets/isArmstrongNumber.md index 139de9d72..65972fc88 100644 --- a/snippets/isArmstrongNumber.md +++ b/snippets/isArmstrongNumber.md @@ -5,9 +5,12 @@ Checks if the given number is an Armstrong number or not. Convert the given number into an array of digits. Use `Math.pow()` to get the appropriate power for each digit and sum them up. If the sum is equal to the number itself, return `true` otherwise `false`. ```js -const isArmstrongNumber = digits => +const isArmstrongNumber = digits => ( arr => arr.reduce( ( a, d ) => a + Math.pow( parseInt( d ), arr.length ), 0 ) == digits ? true : false )( ( digits+'' ).split( '' ) ); -// isArmstrongNumber(1634) -> true -// isArmstrongNumber(371) -> true -// isArmstrongNumber(56) -> false +``` + +```js +isArmstrongNumber(1634) -> true +isArmstrongNumber(371) -> true +isArmstrongNumber(56) -> false ``` diff --git a/snippets/isArray.md b/snippets/isArray.md index f6e410719..28b80c262 100644 --- a/snippets/isArray.md +++ b/snippets/isArray.md @@ -6,6 +6,9 @@ Use `Array.isArray()` to check if a value is classified as an array. ```js const isArray = val => !!val && Array.isArray(val); -// isArray(null) -> false -// isArray([1]) -> true +``` + +```js +isArray(null) -> false +isArray([1]) -> true ``` diff --git a/snippets/isBoolean.md b/snippets/isBoolean.md index ae402c5e4..ad47fa33e 100644 --- a/snippets/isBoolean.md +++ b/snippets/isBoolean.md @@ -6,6 +6,9 @@ Use `typeof` to check if a value is classified as a boolean primitive. ```js const isBoolean = val => typeof val === 'boolean'; -// isBoolean(null) -> false -// isBoolean(false) -> true +``` + +```js +isBoolean(null) -> false +isBoolean(false) -> true ``` diff --git a/snippets/isDivisible.md b/snippets/isDivisible.md index 5adad9453..95919d69d 100644 --- a/snippets/isDivisible.md +++ b/snippets/isDivisible.md @@ -6,5 +6,8 @@ Use the modulo operator (`%`) to check if the remainder is equal to `0`. ```js const isDivisible = (dividend, divisor) => dividend % divisor === 0; -// isDivisible(6,3) -> true +``` + +```js +isDivisible(6,3) -> true ``` diff --git a/snippets/isEven.md b/snippets/isEven.md index 5dfcb414f..b2bb58b58 100644 --- a/snippets/isEven.md +++ b/snippets/isEven.md @@ -7,5 +7,8 @@ Returns `true` if the number is even, `false` if the number is odd. ```js const isEven = num => num % 2 === 0; -// isEven(3) -> false +``` + +```js +isEven(3) -> false ``` diff --git a/snippets/isFunction.md b/snippets/isFunction.md index af5960e00..eae2073e4 100644 --- a/snippets/isFunction.md +++ b/snippets/isFunction.md @@ -6,6 +6,9 @@ Use `typeof` to check if a value is classified as a function primitive. ```js const isFunction = val => val && typeof val === 'function'; -// isFunction('x') -> false -// isFunction(x => x) -> true +``` + +```js +isFunction('x') -> false +isFunction(x => x) -> true ``` diff --git a/snippets/isNumber.md b/snippets/isNumber.md index 83b33bc11..3035a0a3a 100644 --- a/snippets/isNumber.md +++ b/snippets/isNumber.md @@ -6,6 +6,9 @@ Use `typeof` to check if a value is classified as a number primitive. ```js const isNumber = val => typeof val === 'number'; -// isNumber('1') -> false -// isNumber(1) -> true ``` + +```js +isNumber('1') -> false +isNumber(1) -> true +``` \ No newline at end of file diff --git a/snippets/isPrime.md b/snippets/isPrime.md index 6f77ebd6c..2e609028b 100644 --- a/snippets/isPrime.md +++ b/snippets/isPrime.md @@ -2,7 +2,7 @@ Checks if the provided integer is a prime number. -Check numbers from `2` to the square root of the given number. +Check numbers from `2` to the square root of the given number. Return `false` if any of them divides the given number, else return `true`, unless the number is less than `2`. ```js @@ -11,6 +11,9 @@ const isPrime = num => { for (var i = 2; i * i <= boundary; i++) if (num % i == 0) return false; return num >= 2; }; -// isPrime(11) -> true -// isPrime(12) -> false +``` + +```js +isPrime(11) -> true +isPrime(12) -> false ``` diff --git a/snippets/isString.md b/snippets/isString.md index 775e050a4..923bcd174 100644 --- a/snippets/isString.md +++ b/snippets/isString.md @@ -6,6 +6,9 @@ Use `typeof` to check if a value is classified as a string primitive. ```js const isString = val => typeof val === 'string'; -// isString(10) -> false -// isString('10') -> true +``` + +```js +isString(10) -> false +isString('10') -> true ``` diff --git a/snippets/isSymbol.md b/snippets/isSymbol.md index a4ec67dc8..0baa68500 100644 --- a/snippets/isSymbol.md +++ b/snippets/isSymbol.md @@ -6,6 +6,9 @@ Use `typeof` to check if a value is classified as a symbol primitive. ```js const isSymbol = val => typeof val === 'symbol'; -// isSymbol('x') -> false -// isSymbol(Symbol('x')) -> true +``` + +```js +isSymbol('x') -> false +isSymbol(Symbol('x')) -> true ``` From be50a153f2e31bab62049121f9221ed8f55533ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 14:33:49 +0100 Subject: [PATCH 07/36] update snippets 78 - 96 --- snippets/JSONToFile.md | 5 ++++- snippets/last.md | 5 ++++- snippets/lcm.md | 5 ++++- snippets/mapObject.md | 7 ++++--- snippets/median.md | 7 +++++-- snippets/negate.md | 7 +++++-- snippets/nthElement.md | 7 +++++-- snippets/objectFromPairs.md | 5 ++++- snippets/objectToPairs.md | 5 ++++- snippets/orderBy.md | 5 +++-- snippets/palindrome.md | 7 +++++-- snippets/percentile.md | 7 +++++-- snippets/pick.md | 5 ++++- snippets/pipe.md | 5 +++-- snippets/powerset.md | 5 ++++- snippets/primes.md | 11 +++++++---- snippets/promisify.md | 7 +++++-- snippets/pull.md | 20 +++++++++++--------- 18 files changed, 86 insertions(+), 39 deletions(-) diff --git a/snippets/JSONToFile.md b/snippets/JSONToFile.md index 3677fc5e3..300b47e1f 100644 --- a/snippets/JSONToFile.md +++ b/snippets/JSONToFile.md @@ -7,5 +7,8 @@ Use `fs.writeFile()`, template literals and `JSON.stringify()` to write a `json` ```js const fs = require('fs'); const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2)) -// JSONToFile({test: "is passed"}, 'testJsonFile') -> writes the object to 'testJsonFile.json' +``` + +```js +JSONToFile({test: "is passed"}, 'testJsonFile') -> writes the object to 'testJsonFile.json' ``` diff --git a/snippets/last.md b/snippets/last.md index 481e2d6e0..f26427591 100644 --- a/snippets/last.md +++ b/snippets/last.md @@ -6,5 +6,8 @@ Use `arr.length - 1` to compute the index of the last element of the given array ```js const last = arr => arr[arr.length - 1]; -// last([1,2,3]) -> 3 +``` + +```js +last([1,2,3]) -> 3 ``` diff --git a/snippets/lcm.md b/snippets/lcm.md index 73b9c43c8..cc9b32367 100644 --- a/snippets/lcm.md +++ b/snippets/lcm.md @@ -10,5 +10,8 @@ const lcm = (x,y) => { const gcd = (x, y) => !y ? x : gcd(y, x % y); return Math.abs(x*y)/(gcd(x,y)); }; -// lcm(12,7) -> 84 +``` + +```js +lcm(12,7) -> 84 ``` diff --git a/snippets/mapObject.md b/snippets/mapObject.md index eb5ea736f..3eebc515f 100644 --- a/snippets/mapObject.md +++ b/snippets/mapObject.md @@ -5,10 +5,11 @@ Maps the values of an array to an object using a function, where the key-value p Use an anonymous inner function scope to declare an undefined memory space, using closures to store a return value. Use a new `Array` to store the array with a map of the function over its data set and a comma operator to return a second step, without needing to move from one context to another (due to closures and order of operations). ```js -const mapObject = (arr, fn) => +const mapObject = (arr, fn) => (a => (a = [arr, arr.map(fn)], a[0].reduce( (acc,val,ind) => (acc[val] = a[1][ind], acc), {}) )) ( ); -/* +``` + +```js const squareIt = arr => mapObject(arr, a => a*a) squareIt([1,2,3]) // { 1: 1, 2: 4, 3: 9 } -*/ ``` diff --git a/snippets/median.md b/snippets/median.md index c7eea609c..e472e7c0d 100644 --- a/snippets/median.md +++ b/snippets/median.md @@ -10,6 +10,9 @@ const median = arr => { const mid = Math.floor(arr.length / 2), nums = [...arr].sort((a, b) => a - b); return arr.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2; }; -// median([5,6,50,1,-5]) -> 5 -// median([0,10,-2,7]) -> 3.5 +``` + +```js +median([5,6,50,1,-5]) -> 5 +median([0,10,-2,7]) -> 3.5 ``` diff --git a/snippets/negate.md b/snippets/negate.md index 5f14e4a0f..739ad97c1 100644 --- a/snippets/negate.md +++ b/snippets/negate.md @@ -6,6 +6,9 @@ Take a predicate function and apply `not` to it with its arguments. ```js const negate = func => (...args) => !func(...args); -// filter([1, 2, 3, 4, 5, 6], negate(isEven)) -> [1, 3, 5] -// negate(isOdd)(1) -> false +``` + +```js +filter([1, 2, 3, 4, 5, 6], negate(isEven)) -> [1, 3, 5] +negate(isOdd)(1) -> false ``` diff --git a/snippets/nthElement.md b/snippets/nthElement.md index ae472eb38..ba2d1933e 100644 --- a/snippets/nthElement.md +++ b/snippets/nthElement.md @@ -8,6 +8,9 @@ Omit the second argument, `n`, to get the first element of the array. ```js const nthElement = (arr, n=0) => (n>0? arr.slice(n,n+1) : arr.slice(n))[0]; -// nthElement(['a','b','c'],1) -> 'b' -// nthElement(['a','b','b'],-3) -> 'a' +``` + +```js +nthElement(['a','b','c'],1) -> 'b' +nthElement(['a','b','b'],-3) -> 'a' ``` diff --git a/snippets/objectFromPairs.md b/snippets/objectFromPairs.md index ebdacb92c..2ed208f44 100644 --- a/snippets/objectFromPairs.md +++ b/snippets/objectFromPairs.md @@ -6,5 +6,8 @@ Use `Array.reduce()` to create and combine key-value pairs. ```js const objectFromPairs = arr => arr.reduce((a, v) => (a[v[0]] = v[1], a), {}); -// objectFromPairs([['a',1],['b',2]]) -> {a: 1, b: 2} +``` + +```js +objectFromPairs([['a',1],['b',2]]) -> {a: 1, b: 2} ``` diff --git a/snippets/objectToPairs.md b/snippets/objectToPairs.md index 7a6079650..6ea5fc051 100644 --- a/snippets/objectToPairs.md +++ b/snippets/objectToPairs.md @@ -6,5 +6,8 @@ Use `Object.keys()` and `Array.map()` to iterate over the object's keys and prod ```js const objectToPairs = obj => Object.keys(obj).map(k => [k, obj[k]]); -// objectToPairs({a: 1, b: 2}) -> [['a',1],['b',2]]) +``` + +```js +objectToPairs({a: 1, b: 2}) -> [['a',1],['b',2]]) ``` diff --git a/snippets/orderBy.md b/snippets/orderBy.md index c80b3667f..ab5581dc3 100644 --- a/snippets/orderBy.md +++ b/snippets/orderBy.md @@ -16,10 +16,11 @@ const orderBy = (arr, props, orders) => return acc; }, 0) ); -/* +``` + +```js const users = [{ 'name': 'fred', 'age': 48 },{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 },{ 'name': 'barney', 'age': 34 }]; orderby(users, ['name', 'age'], ['asc', 'desc']) -> [{name: 'barney', age: 36}, {name: 'barney', age: 34}, {name: 'fred', age: 48}, {name: 'fred', age: 40}] orderby(users, ['name', 'age']) -> [{name: 'barney', age: 34}, {name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}] -*/ ``` diff --git a/snippets/palindrome.md b/snippets/palindrome.md index cca1bb729..820162617 100644 --- a/snippets/palindrome.md +++ b/snippets/palindrome.md @@ -10,5 +10,8 @@ const palindrome = str => { const s = str.toLowerCase().replace(/[\W_]/g,''); return s === s.split('').reverse().join(''); } -// palindrome('taco cat') -> true - ``` +``` + +```js +palindrome('taco cat') -> true +``` diff --git a/snippets/percentile.md b/snippets/percentile.md index 7485494e2..5287521b0 100644 --- a/snippets/percentile.md +++ b/snippets/percentile.md @@ -7,5 +7,8 @@ Use `Array.reduce()` to calculate how many numbers are below the value and how m ```js const percentile = (arr, val) => 100 * arr.reduce((acc,v) => acc + (v < val ? 1 : 0) + (v === val ? 0.5 : 0), 0) / arr.length; -// percentile([1,2,3,4,5,6,7,8,9,10], 6) -> 55 - ``` +``` + +```js +percentile([1,2,3,4,5,6,7,8,9,10], 6) -> 55 +``` diff --git a/snippets/pick.md b/snippets/pick.md index 668c9d30c..0bfeba286 100644 --- a/snippets/pick.md +++ b/snippets/pick.md @@ -7,5 +7,8 @@ Use `Array.reduce()` to convert the filtered/picked keys back to an object with ```js const pick = (obj, arr) => arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {}); -// pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) -> { 'a': 1, 'c': 3 } +``` + +```js +pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) -> { 'a': 1, 'c': 3 } ``` diff --git a/snippets/pipe.md b/snippets/pipe.md index 4c6495cda..a7c271afe 100644 --- a/snippets/pipe.md +++ b/snippets/pipe.md @@ -7,10 +7,11 @@ The first (leftmost) function can accept one or more arguments; the remaining fu ```js const pipeFunctions = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args))); -/* +``` + +```js const add5 = x => x + 5 const multiply = (x, y) => x * y const multiplyAndAdd5 = pipeFunctions(multiply, add5) multiplyAndAdd5(5, 2) -> 15 -*/ ``` diff --git a/snippets/powerset.md b/snippets/powerset.md index 09b233212..dc91406e9 100644 --- a/snippets/powerset.md +++ b/snippets/powerset.md @@ -7,5 +7,8 @@ Use `Array.reduce()` combined with `Array.map()` to iterate over elements and co ```js const powerset = arr => arr.reduce((a, v) => a.concat(a.map(r => [v].concat(r))), [[]]); -// powerset([1,2]) -> [[], [1], [2], [2,1]] +``` + +```js +powerset([1,2]) -> [[], [1], [2], [2,1]] ``` diff --git a/snippets/primes.md b/snippets/primes.md index 81e8f2999..c8b64f1e5 100644 --- a/snippets/primes.md +++ b/snippets/primes.md @@ -1,4 +1,4 @@ -### primes +### primes Generates primes up to a given number, using the Sieve of Eratosthenes. @@ -6,11 +6,14 @@ Generate an array from `2` to the given number. Use `Array.filter()` to filter o ```js const primes = num => { - let arr = Array.from({length:num-1}).map((x,i)=> i+2), + let arr = Array.from({length:num-1}).map((x,i)=> i+2), sqroot = Math.floor(Math.sqrt(num)), numsTillSqroot = Array.from({length:sqroot-1}).map((x,i)=> i+2); numsTillSqroot.forEach(x => arr = arr.filter(y => ((y%x)!==0)||(y==x))); - return arr; + return arr; } -// primes(10) -> [2,3,5,7] +``` + +```js +primes(10) -> [2,3,5,7] ``` diff --git a/snippets/promisify.md b/snippets/promisify.md index 80a7d48d0..4769fa5e9 100644 --- a/snippets/promisify.md +++ b/snippets/promisify.md @@ -14,6 +14,9 @@ const promisify = func => func(...args, (err, result) => err ? reject(err) : resolve(result)) ); -// const delay = promisify((d, cb) => setTimeout(cb, d)) -// delay(2000).then(() => console.log('Hi!')) -> Promise resolves after 2s +``` + +```js +const delay = promisify((d, cb) => setTimeout(cb, d)) +delay(2000).then(() => console.log('Hi!')) -> // Promise resolves after 2s ``` diff --git a/snippets/pull.md b/snippets/pull.md index d7d0412c0..52e0f3ea6 100644 --- a/snippets/pull.md +++ b/snippets/pull.md @@ -11,15 +11,17 @@ _(For a snippet that does not mutate the original array see [`without`](#without const pull = (arr, ...args) => { let argState = Array.isArray(args[0]) ? args[0] : args; let pulled = arr.filter((v, i) => !argState.includes(v)); - arr.length = 0; + arr.length = 0; pulled.forEach(v => arr.push(v)); }; - -// let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c']; -// pull(myArray1, 'a', 'c'); -// console.log(myArray1) -> [ 'b', 'b' ] - -// let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c']; -// pull(myArray2, ['a', 'c']); -// console.log(myArray2) -> [ 'b', 'b' ] +``` + +```js +let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c']; +pull(myArray1, 'a', 'c'); +console.log(myArray1) -> [ 'b', 'b' ] + +let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c']; +pull(myArray2, ['a', 'c']); +console.log(myArray2) -> [ 'b', 'b' ] ``` From 7e52dd6d4392e1a1fb888aafe9a29d5e2e7cd949 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 14:38:49 +0100 Subject: [PATCH 08/36] update snippets 96-107 --- snippets/RGBToHex.md | 5 ++++- snippets/pullAtIndex.md | 18 ++++++++++-------- snippets/pullAtValue.md | 9 +++++---- snippets/randomHexColorCode.md | 11 +++++++---- snippets/randomIntegerInRange.md | 5 ++++- snippets/randomNumberInRange.md | 5 ++++- snippets/readFileLines.md | 19 ++++++++++--------- snippets/redirect.md | 5 ++++- snippets/remove.md | 5 ++++- snippets/repeatString.md | 7 +++++-- snippets/reverseString.md | 5 ++++- 11 files changed, 61 insertions(+), 33 deletions(-) diff --git a/snippets/RGBToHex.md b/snippets/RGBToHex.md index eb13cbeb4..f7568f70f 100644 --- a/snippets/RGBToHex.md +++ b/snippets/RGBToHex.md @@ -6,5 +6,8 @@ Convert given RGB parameters to hexadecimal string using bitwise left-shift oper ```js const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0'); -// RGBToHex(255, 165, 1) -> 'ffa501' +``` + +```js +RGBToHex(255, 165, 1) -> 'ffa501' ``` diff --git a/snippets/pullAtIndex.md b/snippets/pullAtIndex.md index 260d7b634..bd7472567 100644 --- a/snippets/pullAtIndex.md +++ b/snippets/pullAtIndex.md @@ -4,21 +4,23 @@ Mutates the original array to filter out the values at the specified indexes. Use `Array.filter()` and `Array.includes()` to pull out the values that are not needed. Use `Array.length = 0` to mutate the passed in an array by resetting it's length to zero and `Array.push()` to re-populate it with only the pulled values. -Use `Array.push()` to keep track of pulled values +Use `Array.push()` to keep track of pulled values ```js const pullAtIndex = (arr, pullArr) => { let removed = []; let pulled = arr.map((v, i) => pullArr.includes(i) ? removed.push(v) : v) .filter((v, i) => !pullArr.includes(i)) - arr.length = 0; + arr.length = 0; pulled.forEach(v => arr.push(v)); return removed; } - -// let myArray = ['a', 'b', 'c', 'd']; -// let pulled = pullAtIndex(myArray, [1, 3]); - -// console.log(myArray); -> [ 'a', 'c' ] -// console.log(pulled); -> [ 'b', 'd' ] +``` + +```js +let myArray = ['a', 'b', 'c', 'd']; +let pulled = pullAtIndex(myArray, [1, 3]); + +console.log(myArray); -> [ 'a', 'c' ] +console.log(pulled); -> [ 'b', 'd' ] ``` diff --git a/snippets/pullAtValue.md b/snippets/pullAtValue.md index 52e1eac21..97a59a0ed 100644 --- a/snippets/pullAtValue.md +++ b/snippets/pullAtValue.md @@ -4,21 +4,22 @@ Mutates the original array to filter out the values specified. Returns the remov Use `Array.filter()` and `Array.includes()` to pull out the values that are not needed. Use `Array.length = 0` to mutate the passed in an array by resetting it's length to zero and `Array.push()` to re-populate it with only the pulled values. -Use `Array.push()` to keep track of pulled values +Use `Array.push()` to keep track of pulled values ```js const pullAtValue = (arr, pullArr) => { - let removed = [], + let removed = [], pushToRemove = arr.forEach((v, i) => pullArr.includes(v) ? removed.push(v) : v), mutateTo = arr.filter((v, i) => !pullArr.includes(v)); arr.length = 0; mutateTo.forEach(v => arr.push(v)); return removed; } -/* +``` + +```js let myArray = ['a', 'b', 'c', 'd']; let pulled = pullAtValue(myArray, ['b', 'd']); console.log(myArray); -> [ 'a', 'c' ] console.log(pulled); -> [ 'b', 'd' ] -*/ ``` diff --git a/snippets/randomHexColorCode.md b/snippets/randomHexColorCode.md index 83d7d0f91..a40f129e2 100644 --- a/snippets/randomHexColorCode.md +++ b/snippets/randomHexColorCode.md @@ -2,11 +2,14 @@ Generates a random hexadecimal color code. -Use `Math.random` to generate a random 24-bit(6x4bits) hexadecimal number. Use bit shifting and then convert it to an hexadecimal String using `toString(16)`. +Use `Math.random` to generate a random 24-bit(6x4bits) hexadecimal number. Use bit shifting and then convert it to an hexadecimal String using `toString(16)`. ```js const randomHexColorCode = () => '#'+(Math.random()*0xFFFFFF<<0).toString(16); -// randomHexColorCode() -> "#e34155" -// randomHexColorCode() -> "#fd73a6" -// randomHexColorCode() -> "#4144c6" +``` + +```js +randomHexColorCode() -> "#e34155" +randomHexColorCode() -> "#fd73a6" +randomHexColorCode() -> "#4144c6" ``` diff --git a/snippets/randomIntegerInRange.md b/snippets/randomIntegerInRange.md index 2d35fd279..e8fd26077 100644 --- a/snippets/randomIntegerInRange.md +++ b/snippets/randomIntegerInRange.md @@ -6,5 +6,8 @@ Use `Math.random()` to generate a random number and map it to the desired range, ```js const randomIntegerInRange = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; -// randomIntegerInRange(0, 5) -> 2 +``` + +```js +randomIntegerInRange(0, 5) -> 2 ``` diff --git a/snippets/randomNumberInRange.md b/snippets/randomNumberInRange.md index a92dfff54..53d60b16d 100644 --- a/snippets/randomNumberInRange.md +++ b/snippets/randomNumberInRange.md @@ -6,5 +6,8 @@ Use `Math.random()` to generate a random value, map it to the desired range usin ```js const randomNumberInRange = (min, max) => Math.random() * (max - min) + min; -// randomNumberInRange(2,10) -> 6.0211363285087005 +``` + +```js +randomNumberInRange(2,10) -> 6.0211363285087005 ``` diff --git a/snippets/readFileLines.md b/snippets/readFileLines.md index 6433c6059..1939a78cd 100644 --- a/snippets/readFileLines.md +++ b/snippets/readFileLines.md @@ -9,13 +9,14 @@ creating an array from contents of file by `split`ing file content line by line ```js const fs = require('fs'); const readFileLines = filename => fs.readFileSync(filename).toString('UTF8').split('\n'); -/* - contents of test.txt : - line1 - line2 - line3 - ___________________________ - let arr = readFileLines('test.txt') - console.log(arr) // -> ['line1', 'line2', 'line3'] - */ +``` + +```js +contents of test.txt : + line1 + line2 + line3 + ___________________________ +let arr = readFileLines('test.txt') +console.log(arr) // -> ['line1', 'line2', 'line3'] ``` diff --git a/snippets/redirect.md b/snippets/redirect.md index d98e2caf2..006d5acd0 100644 --- a/snippets/redirect.md +++ b/snippets/redirect.md @@ -8,5 +8,8 @@ Pass a second argument to simulate a link click (`true` - default) or an HTTP re ```js const redirect = (url, asLink = true) => asLink ? window.location.href = url : window.location.replace(url); -// redirect('https://google.com') +``` + +```js +redirect('https://google.com') ``` diff --git a/snippets/remove.md b/snippets/remove.md index 34b10aa24..78be3257b 100644 --- a/snippets/remove.md +++ b/snippets/remove.md @@ -11,5 +11,8 @@ const remove = (arr, func) => arr.splice(arr.indexOf(val), 1); return acc.concat(val); }, []) : []; -// remove([1, 2, 3, 4], n => n % 2 == 0) -> [2, 4] +``` + +```js +remove([1, 2, 3, 4], n => n % 2 == 0) -> [2, 4] ``` diff --git a/snippets/repeatString.md b/snippets/repeatString.md index 888965713..2d892b506 100644 --- a/snippets/repeatString.md +++ b/snippets/repeatString.md @@ -8,6 +8,9 @@ If no string is provided the default is `""` and the default number of times is const repeatString = (str="",num=2) => { return num >= 0 ? str.repeat(num) : str; } -// repeatString("abc",3) -> 'abcabcabc' -// repeatString("abc") -> 'abcabc' +``` + +```js +repeatString("abc",3) -> 'abcabcabc' +repeatString("abc") -> 'abcabc' ``` diff --git a/snippets/reverseString.md b/snippets/reverseString.md index 5564a5897..2fe9cdd0b 100644 --- a/snippets/reverseString.md +++ b/snippets/reverseString.md @@ -7,5 +7,8 @@ Combine characters to get a string using `join('')`. ```js const reverseString = str => str.split('').reverse().join(''); -// reverseString('foobar') -> 'raboof' +``` + +```js +reverseString('foobar') -> 'raboof' ``` From 0be78ba0893f1d0165aceda1416476eeb76fb958 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 14:49:52 +0100 Subject: [PATCH 09/36] update snippets 0-All --- snippets/UUIDGenerator.md | 5 ++++- snippets/round.md | 5 ++++- snippets/runPromisesInSeries.md | 7 +++++-- snippets/sample.md | 5 ++++- snippets/scrollToTop.md | 5 ++++- snippets/select.md | 8 +++++--- snippets/shallowClone.md | 5 +++-- snippets/shuffle.md | 5 ++++- snippets/similarity.md | 5 ++++- snippets/sleep.md | 5 +++-- snippets/sortCharactersInString.md | 5 ++++- snippets/speechSynthesis.md | 5 ++++- snippets/spreadOver.md | 11 ++++++----- snippets/standardDeviation.md | 7 +++++-- snippets/symmetricDifference.md | 5 ++++- snippets/tail.md | 7 +++++-- snippets/take.md | 7 +++++-- snippets/takeRight.md | 7 +++++-- snippets/timeTaken.md | 7 +++++-- snippets/toCamelCase.md | 11 +++++++---- snippets/toDecimalMark.md | 5 ++++- snippets/toEnglishDate.md | 5 ++++- snippets/toKebabCase.md | 13 ++++++++----- snippets/toOrdinalSuffix.md | 5 ++++- snippets/toSnakeCase.md | 15 +++++++++------ snippets/truncateString.md | 5 ++++- snippets/truthCheckCollection.md | 7 +++++-- snippets/union.md | 5 ++++- snippets/validateNumber.md | 5 ++++- snippets/without.md | 5 ++++- snippets/words.md | 7 +++++-- snippets/zip.md | 7 +++++-- snippets/zipObject.md | 7 +++++-- 33 files changed, 155 insertions(+), 63 deletions(-) diff --git a/snippets/UUIDGenerator.md b/snippets/UUIDGenerator.md index 316659ea2..87300e5ed 100644 --- a/snippets/UUIDGenerator.md +++ b/snippets/UUIDGenerator.md @@ -9,5 +9,8 @@ const UUIDGenerator = () => ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) ); -// UUIDGenerator() -> '7982fcfe-5721-4632-bede-6000885be57d' +``` + +```js +UUIDGenerator() -> '7982fcfe-5721-4632-bede-6000885be57d' ``` diff --git a/snippets/round.md b/snippets/round.md index 7675c734f..9c6b55f2c 100644 --- a/snippets/round.md +++ b/snippets/round.md @@ -7,5 +7,8 @@ Omit the second argument, `decimals` to round to an integer. ```js const round = (n, decimals=0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`); -// round(1.005, 2) -> 1.01 +``` + +```js +round(1.005, 2) -> 1.01 ``` diff --git a/snippets/runPromisesInSeries.md b/snippets/runPromisesInSeries.md index c1cedb147..9719ed6aa 100644 --- a/snippets/runPromisesInSeries.md +++ b/snippets/runPromisesInSeries.md @@ -6,6 +6,9 @@ Use `Array.reduce()` to create a promise chain, where each promise returns the n ```js const runPromisesInSeries = ps => ps.reduce((p, next) => p.then(next), Promise.resolve()); -// const delay = (d) => new Promise(r => setTimeout(r, d)) -// runPromisesInSeries([() => delay(1000), () => delay(2000)]) -> executes each promise sequentially, taking a total of 3 seconds to complete +``` + +```js +const delay = (d) => new Promise(r => setTimeout(r, d)) +runPromisesInSeries([() => delay(1000), () => delay(2000)]) -> //executes each promise sequentially, taking a total of 3 seconds to complete ``` diff --git a/snippets/sample.md b/snippets/sample.md index caf1941e3..078542224 100644 --- a/snippets/sample.md +++ b/snippets/sample.md @@ -7,5 +7,8 @@ This method also works with strings. ```js const sample = arr => arr[Math.floor(Math.random() * arr.length)]; -// sample([3, 7, 9, 11]) -> 9 +``` + +```js +sample([3, 7, 9, 11]) -> 9 ``` diff --git a/snippets/scrollToTop.md b/snippets/scrollToTop.md index 62cad2588..90c0342a8 100644 --- a/snippets/scrollToTop.md +++ b/snippets/scrollToTop.md @@ -13,5 +13,8 @@ const scrollToTop = () => { window.scrollTo(0, c - c / 8); } }; -// scrollToTop() +``` + +```js +scrollToTop() ``` diff --git a/snippets/select.md b/snippets/select.md index ee243bb8e..c3db1e047 100644 --- a/snippets/select.md +++ b/snippets/select.md @@ -7,7 +7,9 @@ If the property does not exists returns `undefined`. ```js const select = (from, selector) => selector.split('.').reduce((prev, cur) => prev && prev[cur], from); - -// const obj = {selector: {to: {val: 'val to select'}}}; -// select(obj, 'selector.to.val'); -> 'val to select' +``` + +```js +const obj = {selector: {to: {val: 'val to select'}}}; +select(obj, 'selector.to.val'); -> 'val to select' ``` diff --git a/snippets/shallowClone.md b/snippets/shallowClone.md index 0a6c25d82..cdef28d9b 100644 --- a/snippets/shallowClone.md +++ b/snippets/shallowClone.md @@ -6,9 +6,10 @@ Use `Object.assign()` and an empty object (`{}`) to create a shallow clone of th ```js const shallowClone = obj => Object.assign({}, obj); -/* +``` + +```js const a = { x: true, y: 1 }; const b = shallowClone(a); a === b -> false -*/ ``` diff --git a/snippets/shuffle.md b/snippets/shuffle.md index 27d7fd783..00b434d77 100644 --- a/snippets/shuffle.md +++ b/snippets/shuffle.md @@ -6,5 +6,8 @@ Use `Array.sort()` to reorder elements, using `Math.random()` in the comparator. ```js const shuffle = arr => arr.sort(() => Math.random() - 0.5); -// shuffle([1,2,3]) -> [2,3,1] +``` + +```js +shuffle([1,2,3]) -> [2,3,1] ``` diff --git a/snippets/similarity.md b/snippets/similarity.md index 1a2cc7ccb..e1f735be2 100644 --- a/snippets/similarity.md +++ b/snippets/similarity.md @@ -6,5 +6,8 @@ Use `filter()` to remove values that are not part of `values`, determined using ```js const similarity = (arr, values) => arr.filter(v => values.includes(v)); -// similarity([1,2,3], [1,2,4]) -> [1,2] +``` + +```js +similarity([1,2,3], [1,2,4]) -> [1,2] ``` diff --git a/snippets/sleep.md b/snippets/sleep.md index 66a45d2ff..69fd73059 100644 --- a/snippets/sleep.md +++ b/snippets/sleep.md @@ -6,11 +6,12 @@ Delay executing part of an `async` function, by putting it to sleep, returning a ```js const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); -/* +``` + +```js async function sleepyWork() { console.log('I\'m going to sleep for 1 second.'); await sleep(1000); console.log('I woke up after 1 second.'); } -*/ ``` diff --git a/snippets/sortCharactersInString.md b/snippets/sortCharactersInString.md index 79c7acc0f..4e7e68cf7 100644 --- a/snippets/sortCharactersInString.md +++ b/snippets/sortCharactersInString.md @@ -7,5 +7,8 @@ Split the string using `split('')`, `Array.sort()` utilizing `localeCompare()`, ```js const sortCharactersInString = str => str.split('').sort((a, b) => a.localeCompare(b)).join(''); -// sortCharactersInString('cabbage') -> 'aabbceg' +``` + +```js +sortCharactersInString('cabbage') -> 'aabbceg' ``` diff --git a/snippets/speechSynthesis.md b/snippets/speechSynthesis.md index cb8d150f4..2ccb55375 100644 --- a/snippets/speechSynthesis.md +++ b/snippets/speechSynthesis.md @@ -13,5 +13,8 @@ const speechSynthesis = message => { msg.voice = window.speechSynthesis.getVoices()[0]; window.speechSynthesis.speak(msg); }; -// speechSynthesis('Hello, World') -> plays the message +``` + +```js +speechSynthesis('Hello, World') -> // plays the message ``` diff --git a/snippets/spreadOver.md b/snippets/spreadOver.md index aff6281a6..d41b1cb36 100644 --- a/snippets/spreadOver.md +++ b/snippets/spreadOver.md @@ -6,9 +6,10 @@ Use closures and the spread operator (`...`) to map the array of arguments to th ```js const spreadOver = fn => argsArr => fn(...argsArr); -/* +``` + +```js const arrayMax = spreadOver(Math.max) -arrayMax([1,2,3]) // -> 3 -arrayMax([1,2,4]) // -> 4 -*/ -``` +arrayMax([1,2,3]) -> 3 +arrayMax([1,2,4]) -> 4 +``` diff --git a/snippets/standardDeviation.md b/snippets/standardDeviation.md index 51cf4a0dd..43d7139fd 100644 --- a/snippets/standardDeviation.md +++ b/snippets/standardDeviation.md @@ -14,6 +14,9 @@ const standardDeviation = (arr, usePopulation = false) => { .reduce((acc, val) => acc + val, 0) / (arr.length - (usePopulation ? 0 : 1)) ); }; -// standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample) -// standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population) +``` + +```js +standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample) +standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population) ``` diff --git a/snippets/symmetricDifference.md b/snippets/symmetricDifference.md index a25bb52ef..6879edb39 100644 --- a/snippets/symmetricDifference.md +++ b/snippets/symmetricDifference.md @@ -9,5 +9,8 @@ const symmetricDifference = (a, b) => { const sA = new Set(a), sB = new Set(b); return [...a.filter(x => !sB.has(x)), ...b.filter(x => !sA.has(x))]; } -// symmetricDifference([1,2,3], [1,2,4]) -> [3,4] +``` + +```js +symmetricDifference([1,2,3], [1,2,4]) -> [3,4] ``` diff --git a/snippets/tail.md b/snippets/tail.md index 9d84a17f1..69983d169 100644 --- a/snippets/tail.md +++ b/snippets/tail.md @@ -6,6 +6,9 @@ Return `arr.slice(1)` if the array's `length` is more than `1`, otherwise, retur ```js const tail = arr => arr.length > 1 ? arr.slice(1) : arr; -// tail([1,2,3]) -> [2,3] -// tail([1]) -> [1] +``` + +```js +tail([1,2,3]) -> [2,3] +tail([1]) -> [1] ``` diff --git a/snippets/take.md b/snippets/take.md index f6afa5dab..07d25262d 100644 --- a/snippets/take.md +++ b/snippets/take.md @@ -6,6 +6,9 @@ Use `Array.slice()` to create a slice of the array with `n` elements taken from ```js const take = (arr, n = 1) => arr.slice(0, n); -// take([1, 2, 3], 5) -> [1, 2, 3] -// take([1, 2, 3], 0) -> [] +``` + +```js +take([1, 2, 3], 5) -> [1, 2, 3] +take([1, 2, 3], 0) -> [] ``` diff --git a/snippets/takeRight.md b/snippets/takeRight.md index a8fc0e114..45d272ed0 100644 --- a/snippets/takeRight.md +++ b/snippets/takeRight.md @@ -6,6 +6,9 @@ Use `Array.slice()` to create a slice of the array with `n` elements taken from ```js const takeRight = (arr, n = 1) => arr.slice(arr.length - n, arr.length); -// takeRight([1, 2, 3], 2) -> [ 2, 3 ] -// takeRight([1, 2, 3]) -> [3] +``` + +```js +takeRight([1, 2, 3], 2) -> [ 2, 3 ] +takeRight([1, 2, 3]) -> [3] ``` diff --git a/snippets/timeTaken.md b/snippets/timeTaken.md index 2c7bc181f..b687edecf 100644 --- a/snippets/timeTaken.md +++ b/snippets/timeTaken.md @@ -9,6 +9,9 @@ const timeTaken = callback => { console.time('timeTaken'); const r = callback(); console.timeEnd('timeTaken'); return r; }; -// timeTaken(() => Math.pow(2, 10)) -> 1024 -// (logged): timeTaken: 0.02099609375ms +``` + +```js +timeTaken(() => Math.pow(2, 10)) -> 1024 +(logged): timeTaken: 0.02099609375ms ``` diff --git a/snippets/toCamelCase.md b/snippets/toCamelCase.md index 5100441af..3b0621050 100644 --- a/snippets/toCamelCase.md +++ b/snippets/toCamelCase.md @@ -12,8 +12,11 @@ const toCamelCase = str => { .join(''); return s.slice(0,1).toLowerCase() + s.slice(1) } -// toCamelCase("some_database_field_name") -> 'someDatabaseFieldName' -// toCamelCase("Some label that needs to be camelized") -> 'someLabelThatNeedsToBeCamelized' -// toCamelCase("some-javascript-property") -> 'someJavascriptProperty' -// toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") -> 'someMixedStringWithSpacesUnderscoresAndHyphens' +``` + +```js +toCamelCase("some_database_field_name") -> 'someDatabaseFieldName' +toCamelCase("Some label that needs to be camelized") -> 'someLabelThatNeedsToBeCamelized' +toCamelCase("some-javascript-property") -> 'someJavascriptProperty' +toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") -> 'someMixedStringWithSpacesUnderscoresAndHyphens' ``` diff --git a/snippets/toDecimalMark.md b/snippets/toDecimalMark.md index 94e821376..4a2716c0a 100644 --- a/snippets/toDecimalMark.md +++ b/snippets/toDecimalMark.md @@ -4,5 +4,8 @@ Use `toLocaleString()` to convert a float-point arithmetic to the [Decimal mark] ```js const toDecimalMark = num => num.toLocaleString("en-US"); -// toDecimalMark(12305030388.9087) -> "12,305,030,388.9087" +``` + +```js +toDecimalMark(12305030388.9087) -> "12,305,030,388.9087" ``` diff --git a/snippets/toEnglishDate.md b/snippets/toEnglishDate.md index 329eea38b..1d600c808 100644 --- a/snippets/toEnglishDate.md +++ b/snippets/toEnglishDate.md @@ -8,5 +8,8 @@ Throws an error if the passed time cannot be converted to a date. ```js const toEnglishDate = (time) => {try{return new Date(time).toISOString().split('T')[0].replace(/-/g, '/')}catch(e){return}}; -// toEnglishDate('09/21/2010') -> '21/09/2010' +``` + +```js +toEnglishDate('09/21/2010') -> '21/09/2010' ``` diff --git a/snippets/toKebabCase.md b/snippets/toKebabCase.md index 20c7e2546..50b7ead16 100644 --- a/snippets/toKebabCase.md +++ b/snippets/toKebabCase.md @@ -10,9 +10,12 @@ const toKebabCase = str => str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) .map(x => x.toLowerCase()) .join('-'); -// toKebabCase("camelCase") -> 'camel-case' -// toKebabCase("some text") -> 'some-text' -// toKebabCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some-mixed-string-with-spaces-underscores-and-hyphens' -// toKebabCase("AllThe-small Things") -> "all-the-small-things" -// toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-xml-and-html" +``` + +```js +toKebabCase("camelCase") -> 'camel-case' +toKebabCase("some text") -> 'some-text' +toKebabCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some-mixed-string-with-spaces-underscores-and-hyphens' +toKebabCase("AllThe-small Things") -> "all-the-small-things" +toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-xml-and-html" ``` diff --git a/snippets/toOrdinalSuffix.md b/snippets/toOrdinalSuffix.md index 482286056..53541c162 100644 --- a/snippets/toOrdinalSuffix.md +++ b/snippets/toOrdinalSuffix.md @@ -13,5 +13,8 @@ const toOrdinalSuffix = num => { tPattern = [11, 12, 13, 14, 15, 16, 17, 18, 19]; return oPattern.includes(digits[0]) && !tPattern.includes(digits[1]) ? int + ordinals[digits[0] - 1] : int + ordinals[3]; }; -// toOrdinalSuffix("123") -> "123rd" +``` + +```js +toOrdinalSuffix("123") -> "123rd" ``` diff --git a/snippets/toSnakeCase.md b/snippets/toSnakeCase.md index 85b3af9b9..d978e7abc 100644 --- a/snippets/toSnakeCase.md +++ b/snippets/toSnakeCase.md @@ -10,10 +10,13 @@ const toSnakeCase = str =>{ str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) .map(x => x.toLowerCase()) .join('_'); -// toSnakeCase("camelCase") -> 'camel_case' -// toSnakeCase("some text") -> 'some_text' -// toSnakeCase("some-javascript-property") -> 'some_javascript_property' -// toSnakeCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some_mixed_string_with_spaces_underscores_and_hyphens' -// toKebabCase("AllThe-small Things") -> "all_the_smal_things" -// toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html" +``` + +```js +toSnakeCase("camelCase") -> 'camel_case' +toSnakeCase("some text") -> 'some_text' +toSnakeCase("some-javascript-property") -> 'some_javascript_property' +toSnakeCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some_mixed_string_with_spaces_underscores_and_hyphens' +toSnakeCase("AllThe-small Things") -> "all_the_smal_things" +toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html" ``` diff --git a/snippets/truncateString.md b/snippets/truncateString.md index 48924b0ae..56561cc7f 100644 --- a/snippets/truncateString.md +++ b/snippets/truncateString.md @@ -8,5 +8,8 @@ Return the string truncated to the desired length, with `...` appended to the en ```js const truncateString = (str, num) => str.length > num ? str.slice(0, num > 3 ? num - 3 : num) + '...' : str; -// truncateString('boomerang', 7) -> 'boom...' +``` + +```js +truncateString('boomerang', 7) -> 'boom...' ``` diff --git a/snippets/truthCheckCollection.md b/snippets/truthCheckCollection.md index 3c592d308..a2c4cb35e 100644 --- a/snippets/truthCheckCollection.md +++ b/snippets/truthCheckCollection.md @@ -3,8 +3,11 @@ Checks if the predicate (second argument) is truthy on all elements of a collection (first argument). Use `Array.every()` to check if each passed object has the specified property and if it returns a truthy value. - + ```js const truthCheckCollection = (collection, pre) => (collection.every(obj => obj[pre])); -// truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") -> true +``` + +```js +truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") -> true ``` diff --git a/snippets/union.md b/snippets/union.md index 27427a9aa..d141d2a3e 100644 --- a/snippets/union.md +++ b/snippets/union.md @@ -6,5 +6,8 @@ Create a `Set` with all values of `a` and `b` and convert to an array. ```js const union = (a, b) => Array.from(new Set([...a, ...b])); -// union([1,2,3], [4,3,2]) -> [1,2,3,4] +``` + +```js +union([1,2,3], [4,3,2]) -> [1,2,3,4] ``` diff --git a/snippets/validateNumber.md b/snippets/validateNumber.md index 8874cfce2..075e6b4f9 100644 --- a/snippets/validateNumber.md +++ b/snippets/validateNumber.md @@ -8,5 +8,8 @@ Use `Number()` to check if the coercion holds. ```js const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n; -// validateNumber('10') -> true +``` + +```js +validateNumber('10') -> true ``` diff --git a/snippets/without.md b/snippets/without.md index 532ec26d9..044f2e8f6 100644 --- a/snippets/without.md +++ b/snippets/without.md @@ -8,5 +8,8 @@ _(For a snippet that mutates the original array see [`pull`](#pull))_ ```js const without = (arr, ...args) => arr.filter(v => !args.includes(v)); -// without([2, 1, 2, 3], 1, 2) -> [3] +``` + +```js +without([2, 1, 2, 3], 1, 2) -> [3] ``` diff --git a/snippets/words.md b/snippets/words.md index df6b258b7..47d70659d 100644 --- a/snippets/words.md +++ b/snippets/words.md @@ -7,6 +7,9 @@ Omit the second argument to use the default regex. ```js const words = (str, pattern = /[^a-zA-Z-]+/) => str.split(pattern).filter(Boolean); -// words("I love javaScript!!") -> ["I", "love", "javaScript"] -// words("python, javaScript & coffee") -> ["python", "javaScript", "coffee"] +``` + +```js +words("I love javaScript!!") -> ["I", "love", "javaScript"] +words("python, javaScript & coffee") -> ["python", "javaScript", "coffee"] ``` diff --git a/snippets/zip.md b/snippets/zip.md index c9a720e8e..1d3a9080d 100644 --- a/snippets/zip.md +++ b/snippets/zip.md @@ -13,6 +13,9 @@ const zip = (...arrays) => { return Array.from({length: arrays.length}, (_, k) => arrays[k][i]); }) } -//zip(['a', 'b'], [1, 2], [true, false]); -> [['a', 1, true], ['b', 2, false]] -//zip(['a'], [1, 2], [true, false]); -> [['a', 1, true], [undefined, 2, false]] +``` + +```js +zip(['a', 'b'], [1, 2], [true, false]); -> [['a', 1, true], ['b', 2, false]] +zip(['a'], [1, 2], [true, false]); -> [['a', 1, true], [undefined, 2, false]] ``` diff --git a/snippets/zipObject.md b/snippets/zipObject.md index f9214e7aa..a9ea71146 100644 --- a/snippets/zipObject.md +++ b/snippets/zipObject.md @@ -6,6 +6,9 @@ Since an object can have undefined values but not undefined property pointers, t ```js const zipObject = ( props, values ) => props.reduce( ( obj, prop, index ) => ( obj[prop] = values[index], obj ), {} ) -// zipObject(['a','b','c'], [1,2]) -> {a: 1, b: 2, c: undefined} -// zipObject(['a','b'], [1,2,3]) -> {a: 1, b: 2} +``` + +```js +zipObject(['a','b','c'], [1,2]) -> {a: 1, b: 2, c: undefined} +zipObject(['a','b'], [1,2,3]) -> {a: 1, b: 2} ``` From c46730fb27ae9edb86a4aa365d2265444d7dbb55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 14:51:48 +0100 Subject: [PATCH 10/36] builder --- README.md | 888 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 633 insertions(+), 255 deletions(-) diff --git a/README.md b/README.md index ba36f06b3..0bde8d78f 100644 --- a/README.md +++ b/README.md @@ -185,12 +185,13 @@ Use a closure to call a stored key with stored arguments. ```js const call = ( key, ...args ) => context => context[ key ]( ...args ); -/* +``` + +```js Promise.resolve( [ 1, 2, 3 ] ).then( call('map', x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ] const map = call.bind(null, 'map') Promise.resolve( [ 1, 2, 3 ] ).then( map( x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ] -*/ -``` +``` [⬆ back to top](#table-of-contents) @@ -202,14 +203,15 @@ Given a function, return a closure that collects all inputs into an array-accept ```js const collectInto = fn => ( ...args ) => fn( args ); -/* +``` + +```js const Pall = collectInto( Promise.all.bind(Promise) ) let p1 = Promise.resolve(1) let p2 = Promise.resolve(2) let p3 = new Promise((resolve) => setTimeout(resolve,2000,3)) Pall(p1, p2, p3).then(console.log) -*/ -``` +``` [⬆ back to top](#table-of-contents) @@ -221,7 +223,9 @@ Return a closure that takes variadic inputs, and splices the last argument to ma ```js const flip = fn => (...args) => fn(args.pop(), ...args) -/* +``` + +```js let a = {name: 'John Smith'} let b = {} const mergeFrom = flip(Object.assign) @@ -229,7 +233,6 @@ let mergePerson = mergeFrom.bind(null, a) mergePerson(b) // == b b = {} Object.assign(b, a) // == b -*/ ``` [⬆ back to top](#table-of-contents) @@ -250,8 +253,11 @@ const promisify = func => func(...args, (err, result) => err ? reject(err) : resolve(result)) ); -// const delay = promisify((d, cb) => setTimeout(cb, d)) -// delay(2000).then(() => console.log('Hi!')) -> Promise resolves after 2s +``` + +```js +const delay = promisify((d, cb) => setTimeout(cb, d)) +delay(2000).then(() => console.log('Hi!')) -> // Promise resolves after 2s ``` [⬆ back to top](#table-of-contents) @@ -264,12 +270,13 @@ Use closures and the spread operator (`...`) to map the array of arguments to th ```js const spreadOver = fn => argsArr => fn(...argsArr); -/* +``` + +```js const arrayMax = spreadOver(Math.max) -arrayMax([1,2,3]) // -> 3 -arrayMax([1,2,4]) // -> 4 -*/ -``` +arrayMax([1,2,3]) -> 3 +arrayMax([1,2,4]) -> 4 +``` [⬆ back to top](#table-of-contents) ## Array @@ -285,8 +292,11 @@ const arrayGcd = arr =>{ const gcd = (x, y) => !y ? x : gcd(y, x % y); return arr.reduce((a,b) => gcd(a,b)); } -// arrayGcd([1,2,3,4,5]) -> 1 -// arrayGcd([4,8,12]) -> 4 +``` + +```js +arrayGcd([1,2,3,4,5]) -> 1 +arrayGcd([4,8,12]) -> 4 ``` [⬆ back to top](#table-of-contents) @@ -300,11 +310,14 @@ Use `Array.reduce()` and the `lcm` formula (uses recursion) to calculate the low ```js const arrayLcm = arr =>{ const gcd = (x, y) => !y ? x : gcd(y, x % y); - const lcm = (x, y) => (x*y)/gcd(x, y); + const lcm = (x, y) => (x*y)/gcd(x, y); return arr.reduce((a,b) => lcm(a,b)); } -// arrayLcm([1,2,3,4,5]) -> 60 -// arrayLcm([4,8,12]) -> 24 +``` + +```js +arrayLcm([1,2,3,4,5]) -> 60 +arrayLcm([4,8,12]) -> 24 ``` [⬆ back to top](#table-of-contents) @@ -317,7 +330,10 @@ Use `Math.max()` combined with the spread operator (`...`) to get the maximum va ```js const arrayMax = arr => Math.max(...arr); -// arrayMax([10, 1, 5]) -> 10 +``` + +```js +arrayMax([10, 1, 5]) -> 10 ``` [⬆ back to top](#table-of-contents) @@ -330,7 +346,10 @@ Use `Math.min()` combined with the spread operator (`...`) to get the minimum va ```js const arrayMin = arr => Math.min(...arr); -// arrayMin([10, 1, 5]) -> 1 +``` + +```js +arrayMin([10, 1, 5]) -> 1 ``` [⬆ back to top](#table-of-contents) @@ -346,7 +365,10 @@ If the original array can't be split evenly, the final chunk will contain the re ```js const chunk = (arr, size) => Array.from({length: Math.ceil(arr.length / size)}, (v, i) => arr.slice(i * size, i * size + size)); -// chunk([1,2,3,4,5], 2) -> [[1,2],[3,4],[5]] +``` + +```js +chunk([1,2,3,4,5], 2) -> [[1,2],[3,4],[5]] ``` [⬆ back to top](#table-of-contents) @@ -359,7 +381,10 @@ Use `Array.filter()` to filter out falsey values (`false`, `null`, `0`, `""`, `u ```js const compact = arr => arr.filter(Boolean); -// compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) -> [ 1, 2, 3, 'a', 's', 34 ] +``` + +```js +compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) -> [ 1, 2, 3, 'a', 's', 34 ] ``` [⬆ back to top](#table-of-contents) @@ -372,7 +397,10 @@ Use `Array.reduce()` to increment a counter each time you encounter the specific ```js const countOccurrences = (arr, value) => arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0); -// countOccurrences([1,1,2,1,2,3], 1) -> 3 +``` + +```js +countOccurrences([1,1,2,1,2,3], 1) -> 3 ``` [⬆ back to top](#table-of-contents) @@ -387,7 +415,10 @@ Recursively flatten each element that is an array. ```js const deepFlatten = arr => [].concat(...arr.map(v => Array.isArray(v) ? deepFlatten(v) : v)); -// deepFlatten([1,[2],[[3],4],5]) -> [1,2,3,4,5] +``` + +```js +deepFlatten([1,[2],[[3],4],5]) -> [1,2,3,4,5] ``` [⬆ back to top](#table-of-contents) @@ -400,7 +431,10 @@ Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values no ```js const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); }; -// difference([1,2,3], [1,2,4]) -> [3] +``` + +```js +difference([1,2,3], [1,2,4]) -> [3] ``` [⬆ back to top](#table-of-contents) @@ -413,7 +447,10 @@ Use `Array.filter()` and `Array.find()` to find the appropriate values. ```js const differenceWith = (arr, val, comp) => arr.filter(a => !val.find(b => comp(a, b))) -// differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) -> [1, 1.2] +``` + +```js +differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) -> [1, 1.2] ``` [⬆ back to top](#table-of-contents) @@ -426,7 +463,10 @@ Use ES6 `Set` and the `...rest` operator to discard all duplicated values. ```js const distinctValuesOfArray = arr => [...new Set(arr)]; -// distinctValuesOfArray([1,2,2,3,4,4,5]) -> [1,2,3,4,5] +``` + +```js +distinctValuesOfArray([1,2,2,3,4,4,5]) -> [1,2,3,4,5] ``` [⬆ back to top](#table-of-contents) @@ -443,7 +483,10 @@ const dropElements = (arr, func) => { while (arr.length > 0 && !func(arr[0])) arr = arr.slice(1); return arr; }; -// dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4] +``` + +```js +dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4] ``` [⬆ back to top](#table-of-contents) @@ -456,9 +499,12 @@ Use `Array.slice()` to slice the remove the specified number of elements from th ```js const dropRight = (arr, n = 1) => arr.slice(0, -n); -//dropRight([1,2,3]) -> [1,2] -//dropRight([1,2,3], 2) -> [1] -//dropRight([1,2,3], 42) -> [] +``` + +```js +dropRight([1,2,3]) -> [1,2] +dropRight([1,2,3], 2) -> [1] +dropRight([1,2,3], 42) -> [] ``` [⬆ back to top](#table-of-contents) @@ -471,7 +517,10 @@ Use `Array.filter()` to create a new array that contains every nth element of a ```js const everyNth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1); -// everyNth([1,2,3,4,5,6], 2) -> [ 2, 4, 6 ] +``` + +```js +everyNth([1,2,3,4,5,6], 2) -> [ 2, 4, 6 ] ``` [⬆ back to top](#table-of-contents) @@ -484,7 +533,10 @@ Use `Array.filter()` for an array containing only the unique values. ```js const filterNonUnique = arr => arr.filter(i => arr.indexOf(i) === arr.lastIndexOf(i)); -// filterNonUnique([1,2,2,3,4,4,5]) -> [1,3,5] +``` + +```js +filterNonUnique([1,2,2,3,4,4,5]) -> [1,3,5] ``` [⬆ back to top](#table-of-contents) @@ -497,7 +549,10 @@ Use a new array and concatenate it with the spread input array causing a shallow ```js const flatten = arr => [ ].concat( ...arr ); -// flatten([1,[2],3,4]) -> [1,2,3,4] +``` + +```js +flatten([1,[2],3,4]) -> [1,2,3,4] ``` [⬆ back to top](#table-of-contents) @@ -515,7 +570,10 @@ Omit the second element, `depth` to flatten only to a depth of `1` (single flatt const flattenDepth = (arr, depth = 1) => depth != 1 ? arr.reduce((a, v) => a.concat(Array.isArray(v) ? flattenDepth(v, depth - 1) : v), []) : arr.reduce((a, v) => a.concat(v), []); -// flattenDepth([1,[2],[[[3],4],5]], 2) -> [1,2,[3],4,5] +``` + +```js +flatten([1,[2],3,4]) -> [1,2,3,4] ``` [⬆ back to top](#table-of-contents) @@ -531,8 +589,11 @@ Use `Array.reduce()` to create an object, where the keys are produced from the m const groupBy = (arr, func) => arr.map(typeof func === 'function' ? func : val => val[func]) .reduce((acc, val, i) => { acc[val] = (acc[val] || []).concat(arr[i]); return acc; }, {}); -// groupBy([6.1, 4.2, 6.3], Math.floor) -> {4: [4.2], 6: [6.1, 6.3]} -// groupBy(['one', 'two', 'three'], 'length') -> {3: ['one', 'two'], 5: ['three']} +``` + +```js +groupBy([6.1, 4.2, 6.3], Math.floor) -> {4: [4.2], 6: [6.1, 6.3]} +groupBy(['one', 'two', 'three'], 'length') -> {3: ['one', 'two'], 5: ['three']} ``` [⬆ back to top](#table-of-contents) @@ -545,7 +606,10 @@ Use `arr[0]` to return the first element of the passed array. ```js const head = arr => arr[0]; -// head([1,2,3]) -> 1 +``` + +```js +head([1,2,3]) -> 1 ``` [⬆ back to top](#table-of-contents) @@ -558,7 +622,10 @@ Use `arr.slice(0,-1)` to return all but the last element of the array. ```js const initial = arr => arr.slice(0, -1); -// initial([1,2,3]) -> [1,2] +``` + +```js +initial([1,2,3]) -> [1,2] ``` [⬆ back to top](#table-of-contents) @@ -571,7 +638,10 @@ Use `Array.map()` to generate h rows where each is a new array of size w initial ```js const initialize2DArray = (w, h, val = null) => Array(h).fill().map(() => Array(w).fill(val)); -// initializeArrayWithRange(2, 2, 0) -> [[0,0], [0,0]] +``` + +```js +initialize2DArray(2, 2, 0) -> [[0,0], [0,0]] ``` [⬆ back to top](#table-of-contents) @@ -584,10 +654,13 @@ Use `Array((end + 1) - start)` to create an array of the desired length, `Array. You can omit `start` to use a default value of `0`. ```js -const initializeArrayWithRange = (end, start = 0) => +const initializeArrayWithRange = (end, start = 0) => Array.from({ length: (end + 1) - start }).map((v, i) => i + start); -// initializeArrayWithRange(5) -> [0,1,2,3,4,5] -// initializeArrayWithRange(7, 3) -> [3,4,5,6,7] +``` + +```js +initializeArrayWithRange(5) -> [0,1,2,3,4,5] +initializeArrayWithRange(7, 3) -> [3,4,5,6,7] ``` [⬆ back to top](#table-of-contents) @@ -601,7 +674,10 @@ You can omit `value` to use a default value of `0`. ```js const initializeArrayWithValues = (n, value = 0) => Array(n).fill(value); -// initializeArrayWithValues(5, 2) -> [2,2,2,2,2] +``` + +```js +initializeArrayWithValues(5, 2) -> [2,2,2,2,2] ``` [⬆ back to top](#table-of-contents) @@ -614,7 +690,10 @@ Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values co ```js const intersection = (a, b) => { const s = new Set(b); return a.filter(x => s.has(x)); }; -// intersection([1,2,3], [4,3,2]) -> [2,3] +``` + +```js +intersection([1,2,3], [4,3,2]) -> [2,3] ``` [⬆ back to top](#table-of-contents) @@ -627,7 +706,10 @@ Use `arr.length - 1` to compute the index of the last element of the given array ```js const last = arr => arr[arr.length - 1]; -// last([1,2,3]) -> 3 +``` + +```js +last([1,2,3]) -> 3 ``` [⬆ back to top](#table-of-contents) @@ -639,12 +721,13 @@ Maps the values of an array to an object using a function, where the key-value p Use an anonymous inner function scope to declare an undefined memory space, using closures to store a return value. Use a new `Array` to store the array with a map of the function over its data set and a comma operator to return a second step, without needing to move from one context to another (due to closures and order of operations). ```js -const mapObject = (arr, fn) => +const mapObject = (arr, fn) => (a => (a = [arr, arr.map(fn)], a[0].reduce( (acc,val,ind) => (acc[val] = a[1][ind], acc), {}) )) ( ); -/* +``` + +```js const squareIt = arr => mapObject(arr, a => a*a) squareIt([1,2,3]) // { 1: 1, 2: 4, 3: 9 } -*/ ``` [⬆ back to top](#table-of-contents) @@ -659,8 +742,11 @@ Omit the second argument, `n`, to get the first element of the array. ```js const nthElement = (arr, n=0) => (n>0? arr.slice(n,n+1) : arr.slice(n))[0]; -// nthElement(['a','b','c'],1) -> 'b' -// nthElement(['a','b','b'],-3) -> 'a' +``` + +```js +nthElement(['a','b','c'],1) -> 'b' +nthElement(['a','b','b'],-3) -> 'a' ``` [⬆ back to top](#table-of-contents) @@ -674,7 +760,10 @@ Use `Array.reduce()` to convert the filtered/picked keys back to an object with ```js const pick = (obj, arr) => arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {}); -// pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) -> { 'a': 1, 'c': 3 } +``` + +```js +pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) -> { 'a': 1, 'c': 3 } ``` [⬆ back to top](#table-of-contents) @@ -692,17 +781,19 @@ _(For a snippet that does not mutate the original array see [`without`](#without const pull = (arr, ...args) => { let argState = Array.isArray(args[0]) ? args[0] : args; let pulled = arr.filter((v, i) => !argState.includes(v)); - arr.length = 0; + arr.length = 0; pulled.forEach(v => arr.push(v)); }; +``` -// let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c']; -// pull(myArray1, 'a', 'c'); -// console.log(myArray1) -> [ 'b', 'b' ] +```js +let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c']; +pull(myArray1, 'a', 'c'); +console.log(myArray1) -> [ 'b', 'b' ] -// let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c']; -// pull(myArray2, ['a', 'c']); -// console.log(myArray2) -> [ 'b', 'b' ] +let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c']; +pull(myArray2, ['a', 'c']); +console.log(myArray2) -> [ 'b', 'b' ] ``` [⬆ back to top](#table-of-contents) @@ -713,23 +804,25 @@ Mutates the original array to filter out the values at the specified indexes. Use `Array.filter()` and `Array.includes()` to pull out the values that are not needed. Use `Array.length = 0` to mutate the passed in an array by resetting it's length to zero and `Array.push()` to re-populate it with only the pulled values. -Use `Array.push()` to keep track of pulled values +Use `Array.push()` to keep track of pulled values ```js const pullAtIndex = (arr, pullArr) => { let removed = []; let pulled = arr.map((v, i) => pullArr.includes(i) ? removed.push(v) : v) .filter((v, i) => !pullArr.includes(i)) - arr.length = 0; + arr.length = 0; pulled.forEach(v => arr.push(v)); return removed; } +``` -// let myArray = ['a', 'b', 'c', 'd']; -// let pulled = pullAtIndex(myArray, [1, 3]); +```js +let myArray = ['a', 'b', 'c', 'd']; +let pulled = pullAtIndex(myArray, [1, 3]); -// console.log(myArray); -> [ 'a', 'c' ] -// console.log(pulled); -> [ 'b', 'd' ] +console.log(myArray); -> [ 'a', 'c' ] +console.log(pulled); -> [ 'b', 'd' ] ``` [⬆ back to top](#table-of-contents) @@ -740,23 +833,24 @@ Mutates the original array to filter out the values specified. Returns the remov Use `Array.filter()` and `Array.includes()` to pull out the values that are not needed. Use `Array.length = 0` to mutate the passed in an array by resetting it's length to zero and `Array.push()` to re-populate it with only the pulled values. -Use `Array.push()` to keep track of pulled values +Use `Array.push()` to keep track of pulled values ```js const pullAtValue = (arr, pullArr) => { - let removed = [], + let removed = [], pushToRemove = arr.forEach((v, i) => pullArr.includes(v) ? removed.push(v) : v), mutateTo = arr.filter((v, i) => !pullArr.includes(v)); arr.length = 0; mutateTo.forEach(v => arr.push(v)); return removed; } -/* +``` + +```js let myArray = ['a', 'b', 'c', 'd']; let pulled = pullAtValue(myArray, ['b', 'd']); console.log(myArray); -> [ 'a', 'c' ] console.log(pulled); -> [ 'b', 'd' ] -*/ ``` [⬆ back to top](#table-of-contents) @@ -774,7 +868,10 @@ const remove = (arr, func) => arr.splice(arr.indexOf(val), 1); return acc.concat(val); }, []) : []; -// remove([1, 2, 3, 4], n => n % 2 == 0) -> [2, 4] +``` + +```js +remove([1, 2, 3, 4], n => n % 2 == 0) -> [2, 4] ``` [⬆ back to top](#table-of-contents) @@ -788,7 +885,10 @@ This method also works with strings. ```js const sample = arr => arr[Math.floor(Math.random() * arr.length)]; -// sample([3, 7, 9, 11]) -> 9 +``` + +```js +sample([3, 7, 9, 11]) -> 9 ``` [⬆ back to top](#table-of-contents) @@ -801,7 +901,10 @@ Use `Array.sort()` to reorder elements, using `Math.random()` in the comparator. ```js const shuffle = arr => arr.sort(() => Math.random() - 0.5); -// shuffle([1,2,3]) -> [2,3,1] +``` + +```js +shuffle([1,2,3]) -> [2,3,1] ``` [⬆ back to top](#table-of-contents) @@ -814,7 +917,10 @@ Use `filter()` to remove values that are not part of `values`, determined using ```js const similarity = (arr, values) => arr.filter(v => values.includes(v)); -// similarity([1,2,3], [1,2,4]) -> [1,2] +``` + +```js +similarity([1,2,3], [1,2,4]) -> [1,2] ``` [⬆ back to top](#table-of-contents) @@ -830,7 +936,10 @@ const symmetricDifference = (a, b) => { const sA = new Set(a), sB = new Set(b); return [...a.filter(x => !sB.has(x)), ...b.filter(x => !sA.has(x))]; } -// symmetricDifference([1,2,3], [1,2,4]) -> [3,4] +``` + +```js +symmetricDifference([1,2,3], [1,2,4]) -> [3,4] ``` [⬆ back to top](#table-of-contents) @@ -843,8 +952,11 @@ Return `arr.slice(1)` if the array's `length` is more than `1`, otherwise, retur ```js const tail = arr => arr.length > 1 ? arr.slice(1) : arr; -// tail([1,2,3]) -> [2,3] -// tail([1]) -> [1] +``` + +```js +tail([1,2,3]) -> [2,3] +tail([1]) -> [1] ``` [⬆ back to top](#table-of-contents) @@ -857,8 +969,11 @@ Use `Array.slice()` to create a slice of the array with `n` elements taken from ```js const take = (arr, n = 1) => arr.slice(0, n); -// take([1, 2, 3], 5) -> [1, 2, 3] -// take([1, 2, 3], 0) -> [] +``` + +```js +take([1, 2, 3], 5) -> [1, 2, 3] +take([1, 2, 3], 0) -> [] ``` [⬆ back to top](#table-of-contents) @@ -871,8 +986,11 @@ Use `Array.slice()` to create a slice of the array with `n` elements taken from ```js const takeRight = (arr, n = 1) => arr.slice(arr.length - n, arr.length); -// takeRight([1, 2, 3], 2) -> [ 2, 3 ] -// takeRight([1, 2, 3]) -> [3] +``` + +```js +takeRight([1, 2, 3], 2) -> [ 2, 3 ] +takeRight([1, 2, 3]) -> [3] ``` [⬆ back to top](#table-of-contents) @@ -885,7 +1003,10 @@ Create a `Set` with all values of `a` and `b` and convert to an array. ```js const union = (a, b) => Array.from(new Set([...a, ...b])); -// union([1,2,3], [4,3,2]) -> [1,2,3,4] +``` + +```js +union([1,2,3], [4,3,2]) -> [1,2,3,4] ``` [⬆ back to top](#table-of-contents) @@ -900,7 +1021,10 @@ _(For a snippet that mutates the original array see [`pull`](#pull))_ ```js const without = (arr, ...args) => arr.filter(v => !args.includes(v)); -// without([2, 1, 2, 3], 1, 2) -> [3] +``` + +```js +without([2, 1, 2, 3], 1, 2) -> [3] ``` [⬆ back to top](#table-of-contents) @@ -920,8 +1044,11 @@ const zip = (...arrays) => { return Array.from({length: arrays.length}, (_, k) => arrays[k][i]); }) } -//zip(['a', 'b'], [1, 2], [true, false]); -> [['a', 1, true], ['b', 2, false]] -//zip(['a'], [1, 2], [true, false]); -> [['a', 1, true], [undefined, 2, false]] +``` + +```js +zip(['a', 'b'], [1, 2], [true, false]); -> [['a', 1, true], ['b', 2, false]] +zip(['a'], [1, 2], [true, false]); -> [['a', 1, true], [undefined, 2, false]] ``` [⬆ back to top](#table-of-contents) @@ -934,8 +1061,11 @@ Since an object can have undefined values but not undefined property pointers, t ```js const zipObject = ( props, values ) => props.reduce( ( obj, prop, index ) => ( obj[prop] = values[index], obj ), {} ) -// zipObject(['a','b','c'], [1,2]) -> {a: 1, b: 2, c: undefined} -// zipObject(['a','b'], [1,2,3]) -> {a: 1, b: 2} +``` + +```js +zipObject(['a','b','c'], [1,2]) -> {a: 1, b: 2, c: undefined} +zipObject(['a','b'], [1,2,3]) -> {a: 1, b: 2} ``` [⬆ back to top](#table-of-contents) @@ -949,7 +1079,10 @@ Use `Array.map()` and `document.querySelector()` to create a list of html tags. ```js const arrayToHtmlList = (arr, listID) => arr.map(item => document.querySelector("#"+listID).innerHTML+=`
  • ${item}
  • `); -// arrayToHtmlList(['item 1', 'item 2'],'myListID') +``` + +```js +arrayToHtmlList(['item 1', 'item 2'],'myListID') ``` [⬆ back to top](#table-of-contents) @@ -963,6 +1096,9 @@ Use `scrollY`, `scrollHeight` and `clientHeight` to determine if the bottom of t ```js const bottomVisible = () => document.documentElement.clientHeight + window.scrollY >= (document.documentElement.scrollHeight || document.documentElement.clientHeight); +``` + +```js // bottomVisible() -> true ``` @@ -976,7 +1112,10 @@ Use `window.location.href` to get current URL. ```js const currentURL = () => window.location.href; -// currentUrl() -> 'https://google.com' +``` + +```js +currentUrl() -> 'https://google.com' ``` [⬆ back to top](#table-of-contents) @@ -989,8 +1128,11 @@ Use a regular expression to test the `navigator.userAgent` property to figure ou ```js const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? "Mobile" : "Desktop"; -// detectDeviceType() -> "Mobile" -// detectDeviceType() -> "Desktop" +``` + +```js +detectDeviceType() -> "Mobile" +detectDeviceType() -> "Desktop" ``` [⬆ back to top](#table-of-contents) @@ -1013,9 +1155,12 @@ const elementIsVisibleInViewport = (el, partiallyVisible = false) => { ((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth)) : top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth; }; +``` + +```js // e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10} -// elementIsVisibleInViewport(el) -> false (not fully visible) -// elementIsVisibleInViewport(el, true) -> true (partially visible) +elementIsVisibleInViewport(el) -> false // (not fully visible) +elementIsVisibleInViewport(el, true) -> true // (partially visible) ``` [⬆ back to top](#table-of-contents) @@ -1031,7 +1176,10 @@ You can omit `el` to use a default value of `window`. const getScrollPosition = (el = window) => ({x: (el.pageXOffset !== undefined) ? el.pageXOffset : el.scrollLeft, y: (el.pageYOffset !== undefined) ? el.pageYOffset : el.scrollTop}); -// getScrollPosition() -> {x: 0, y: 200} +``` + +```js +getScrollPosition() -> {x: 0, y: 200} ``` [⬆ back to top](#table-of-contents) @@ -1048,7 +1196,10 @@ const getURLParameters = url => url.match(/([^?=&]+)(=([^&]*))/g).reduce( (a, v) => (a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1), a), {} ); -// getURLParameters('http://url.com/page?name=Adam&surname=Smith') -> {name: 'Adam', surname: 'Smith'} +``` + +```js +getURLParameters('http://url.com/page?name=Adam&surname=Smith') -> {name: 'Adam', surname: 'Smith'} ``` [⬆ back to top](#table-of-contents) @@ -1077,7 +1228,10 @@ Pass a second argument to simulate a link click (`true` - default) or an HTTP re ```js const redirect = (url, asLink = true) => asLink ? window.location.href = url : window.location.replace(url); -// redirect('https://google.com') +``` + +```js +redirect('https://google.com') ``` [⬆ back to top](#table-of-contents) @@ -1097,7 +1251,10 @@ const scrollToTop = () => { window.scrollTo(0, c - c / 8); } }; -// scrollToTop() +``` + +```js +scrollToTop() ``` [⬆ back to top](#table-of-contents) @@ -1111,7 +1268,10 @@ Calculate the difference (in days) between two `Date` objects. ```js const getDaysDiffBetweenDates = (dateInitial, dateFinal) => (dateFinal - dateInitial) / (1000 * 3600 * 24); -// getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) -> 9 +``` + +```js +getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) -> 9 ``` [⬆ back to top](#table-of-contents) @@ -1127,7 +1287,10 @@ const JSONToDate = arr => { const dt = new Date(parseInt(arr.toString().substr(6))); return `${ dt.getDate() }/${ dt.getMonth() + 1 }/${ dt.getFullYear() }` }; -// JSONToDate(/Date(1489525200000)/) -> "14/3/2017" +``` + +```js +JSONToDate(/Date(1489525200000)/) -> "14/3/2017" ``` [⬆ back to top](#table-of-contents) @@ -1142,7 +1305,10 @@ Throws an error if the passed time cannot be converted to a date. ```js const toEnglishDate = (time) => {try{return new Date(time).toISOString().split('T')[0].replace(/-/g, '/')}catch(e){return}}; -// toEnglishDate('09/21/2010') -> '21/09/2010' +``` + +```js +toEnglishDate('09/21/2010') -> '21/09/2010' ``` [⬆ back to top](#table-of-contents) @@ -1156,13 +1322,14 @@ Loop through an array of functions containing asynchronous events, calling `next ```js const chainAsync = fns => { let curr = 0; const next = () => fns[curr++](next); next(); }; -/* +``` + +```js chainAsync([ next => { console.log('0 seconds'); setTimeout(next, 1000); }, next => { console.log('1 second'); setTimeout(next, 1000); }, next => { console.log('2 seconds'); } ]) -*/ ``` [⬆ back to top](#table-of-contents) @@ -1176,12 +1343,13 @@ The last (rightmost) function can accept one or more arguments; the remaining fu ```js const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args))); -/* +``` + +```js const add5 = x => x + 5 const multiply = (x, y) => x * y const multiplyAndAdd5 = compose(add5, multiply) multiplyAndAdd5(5, 2) -> 15 -*/ ``` [⬆ back to top](#table-of-contents) @@ -1200,8 +1368,11 @@ const curry = (fn, arity = fn.length, ...args) => arity <= args.length ? fn(...args) : curry.bind(null, fn, arity, ...args); -// curry(Math.pow)(2)(10) -> 1024 -// curry(Math.min, 3)(10)(50)(2) -> 2 +``` + +```js +curry(Math.pow)(2)(10) -> 1024 +curry(Math.min, 3)(10)(50)(2) -> 2 ``` [⬆ back to top](#table-of-contents) @@ -1214,7 +1385,10 @@ Use `console.debug()` and the `name` property of the passed method to log the me ```js const functionName = fn => (console.debug(fn.name), fn); -// functionName(Math.max) -> max (logged in debug channel of console) +``` + +```js +functionName(Math.max) -> max (logged in debug channel of console) ``` [⬆ back to top](#table-of-contents) @@ -1228,12 +1402,13 @@ The first (leftmost) function can accept one or more arguments; the remaining fu ```js const pipeFunctions = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args))); -/* +``` + +```js const add5 = x => x + 5 const multiply = (x, y) => x * y const multiplyAndAdd5 = pipeFunctions(multiply, add5) multiplyAndAdd5(5, 2) -> 15 -*/ ``` [⬆ back to top](#table-of-contents) @@ -1246,8 +1421,11 @@ Use `Array.reduce()` to create a promise chain, where each promise returns the n ```js const runPromisesInSeries = ps => ps.reduce((p, next) => p.then(next), Promise.resolve()); -// const delay = (d) => new Promise(r => setTimeout(r, d)) -// runPromisesInSeries([() => delay(1000), () => delay(2000)]) -> executes each promise sequentially, taking a total of 3 seconds to complete +``` + +```js +const delay = (d) => new Promise(r => setTimeout(r, d)) +runPromisesInSeries([() => delay(1000), () => delay(2000)]) -> //executes each promise sequentially, taking a total of 3 seconds to complete ``` [⬆ back to top](#table-of-contents) @@ -1260,13 +1438,14 @@ Delay executing part of an `async` function, by putting it to sleep, returning a ```js const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); -/* +``` + +```js async function sleepyWork() { console.log('I\'m going to sleep for 1 second.'); await sleep(1000); console.log('I woke up after 1 second.'); } -*/ ``` [⬆ back to top](#table-of-contents) @@ -1280,8 +1459,11 @@ Take a predicate function and apply `not` to it with its arguments. ```js const negate = func => (...args) => !func(...args); -// filter([1, 2, 3, 4, 5, 6], negate(isEven)) -> [1, 3, 5] -// negate(isOdd)(1) -> false +``` + +```js +filter([1, 2, 3, 4, 5, 6], negate(isEven)) -> [1, 3, 5] +negate(isOdd)(1) -> false ``` [⬆ back to top](#table-of-contents) @@ -1295,7 +1477,10 @@ Use `Array.reduce()` to add each value to an accumulator, initialized with a val ```js const arrayAverage = arr => arr.reduce((acc, val) => acc + val, 0) / arr.length; -// arrayAverage([1,2,3]) -> 2 +``` + +```js +arrayAverage([1,2,3]) -> 2 ``` [⬆ back to top](#table-of-contents) @@ -1308,7 +1493,10 @@ Use `Array.reduce()` to add each value to an accumulator, initialized with a val ```js const arraySum = arr => arr.reduce((acc, val) => acc + val, 0); -// arraySum([1,2,3,4]) -> 10 +``` + +```js +arraySum([1,2,3,4]) -> 10 ``` [⬆ back to top](#table-of-contents) @@ -1317,18 +1505,21 @@ const arraySum = arr => arr.reduce((acc, val) => acc + val, 0); Clamps `num` within the inclusive `lower` and `upper` bounds. -If `lower` is greater than `upper`, swap them. -If `num` falls within the range, return `num`. +If `lower` is greater than `upper`, swap them. +If `num` falls within the range, return `num`. Otherwise, return the nearest number in the range. ```js const clampNumber = (num, lower, upper) => { if(lower > upper) upper = [lower, lower = upper][0]; - return (num>=lower && num<=upper) ? num : ((num < lower) ? lower : upper) + return (num>=lower && num<=upper) ? num : ((num < lower) ? lower : upper) } -// clampNumber(2, 3, 5) -> 3 -// clampNumber(1, -1, -5) -> -1 -// clampNumber(3, 2, 4) -> 3 +``` + +```js +clampNumber(2, 3, 5) -> 3 +clampNumber(1, -1, -5) -> -1 +clampNumber(3, 2, 4) -> 3 ``` [⬆ back to top](#table-of-contents) @@ -1341,8 +1532,11 @@ If `n` is even, return `n/2`. Otherwise, return `3n+1`. ```js const collatz = n => (n % 2 == 0) ? (n / 2) : (3 * n + 1); -// collatz(8) --> 4 -// collatz(5) --> 16 +``` + +```js +collatz(8) -> 4 +collatz(5) -> 16 ``` [⬆ back to top](#table-of-contents) @@ -1356,7 +1550,10 @@ Use `Array.map()` and `parseInt()` to transform each value to an integer. ```js const digitize = n => [...''+n].map(i => parseInt(i)); -// digitize(2334) -> [2, 3, 3, 4] +``` + +```js +differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) -> [1, 1.2] ``` [⬆ back to top](#table-of-contents) @@ -1369,7 +1566,10 @@ Use `Math.hypot()` to calculate the Euclidean distance between two points. ```js const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0); -// distance(1,1, 2,3) -> 2.23606797749979 +``` + +```js +distance(1,1, 2,3) -> 2.23606797749979 ``` [⬆ back to top](#table-of-contents) @@ -1387,7 +1587,10 @@ Throws an exception if `n` is a negative number. const factorial = n => n < 0 ? (() => { throw new TypeError('Negative numbers are not allowed!') })() : n <= 1 ? 1 : n * factorial(n - 1); -// factorial(6) -> 720 +``` + +```js +factorial(6) -> 720 ``` [⬆ back to top](#table-of-contents) @@ -1402,7 +1605,10 @@ Use `Array.reduce()` to add values into the array, using the sum of the last two ```js const fibonacci = n => Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []); -// fibonacci(5) -> [0,1,1,2,3] +``` + +```js +factorial(6) -> 720 ``` [⬆ back to top](#table-of-contents) @@ -1416,7 +1622,10 @@ Use a mathematical formula to calculate the number of fibonacci numbers until `n ```js const fibonacciCountUntilNum = num => Math.ceil(Math.log(num * Math.sqrt(5) + 1/2) / Math.log((Math.sqrt(5)+1)/2)); -// fibonacciCountUntilNum(10) -> 7 +``` + +```js +fibonacciCountUntilNum(10) -> 7 ``` [⬆ back to top](#table-of-contents) @@ -1434,7 +1643,10 @@ const fibonacciUntilNum = num => { let n = Math.ceil(Math.log(num * Math.sqrt(5) + 1/2) / Math.log((Math.sqrt(5)+1)/2)); return Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []); } -// fibonacciUntilNum(15) -> [0,1,1,2,3,5,8,13] +``` + +```js +fibonacciCountUntilNum(10) -> 7 ``` [⬆ back to top](#table-of-contents) @@ -1449,7 +1661,10 @@ Otherwise, return the GCD of `y` and the remainder of the division `x/y`. ```js const gcd = (x, y) => !y ? x : gcd(y, x % y); -// gcd (8, 36) -> 4 +``` + +```js +gcd (8, 36) -> 4 ``` [⬆ back to top](#table-of-contents) @@ -1464,14 +1679,17 @@ Count and return the number of `1`s in the string, using `match(/1/g)`. ```js const hammingDistance = (num1, num2) => ((num1 ^ num2).toString(2).match(/1/g) || '').length; -// hammingDistance(2,3) -> 1 +``` + +```js +hammingDistance(2,3) -> 1 ``` [⬆ back to top](#table-of-contents) ### inRange -Checks if the given number falls within the given range. +Checks if the given number falls within the given range. Use arithmetic comparison to check if the given number is in the specified range. If the second parameter, `end`, is not specified, the range is considered to be from `0` to `start`. @@ -1481,10 +1699,13 @@ const inRange = (n, start, end=null) => { if(end && start > end) end = [start, start=end][0]; return (end == null) ? (n>=0 && n=start && n true -// inRange(3, 4) -> true -// inRange(2, 3, 5) -> false -// inrange(3, 2) -> false +``` + +```js +inRange(3, 2, 5) -> true +inRange(3, 4) -> true +inRange(2, 3, 5) -> false +inrange(3, 2) -> false ``` [⬆ back to top](#table-of-contents) @@ -1496,11 +1717,14 @@ Checks if the given number is an Armstrong number or not. Convert the given number into an array of digits. Use `Math.pow()` to get the appropriate power for each digit and sum them up. If the sum is equal to the number itself, return `true` otherwise `false`. ```js -const isArmstrongNumber = digits => +const isArmstrongNumber = digits => ( arr => arr.reduce( ( a, d ) => a + Math.pow( parseInt( d ), arr.length ), 0 ) == digits ? true : false )( ( digits+'' ).split( '' ) ); -// isArmstrongNumber(1634) -> true -// isArmstrongNumber(371) -> true -// isArmstrongNumber(56) -> false +``` + +```js +isArmstrongNumber(1634) -> true +isArmstrongNumber(371) -> true +isArmstrongNumber(56) -> false ``` [⬆ back to top](#table-of-contents) @@ -1513,7 +1737,10 @@ Use the modulo operator (`%`) to check if the remainder is equal to `0`. ```js const isDivisible = (dividend, divisor) => dividend % divisor === 0; -// isDivisible(6,3) -> true +``` + +```js +isDivisible(6,3) -> true ``` [⬆ back to top](#table-of-contents) @@ -1527,7 +1754,10 @@ Returns `true` if the number is even, `false` if the number is odd. ```js const isEven = num => num % 2 === 0; -// isEven(3) -> false +``` + +```js +isEven(3) -> false ``` [⬆ back to top](#table-of-contents) @@ -1536,7 +1766,7 @@ const isEven = num => num % 2 === 0; Checks if the provided integer is a prime number. -Check numbers from `2` to the square root of the given number. +Check numbers from `2` to the square root of the given number. Return `false` if any of them divides the given number, else return `true`, unless the number is less than `2`. ```js @@ -1545,8 +1775,11 @@ const isPrime = num => { for (var i = 2; i * i <= boundary; i++) if (num % i == 0) return false; return num >= 2; }; -// isPrime(11) -> true -// isPrime(12) -> false +``` + +```js +isPrime(11) -> true +isPrime(12) -> false ``` [⬆ back to top](#table-of-contents) @@ -1563,7 +1796,10 @@ const lcm = (x,y) => { const gcd = (x, y) => !y ? x : gcd(y, x % y); return Math.abs(x*y)/(gcd(x,y)); }; -// lcm(12,7) -> 84 +``` + +```js +lcm(12,7) -> 84 ``` [⬆ back to top](#table-of-contents) @@ -1580,8 +1816,11 @@ const median = arr => { const mid = Math.floor(arr.length / 2), nums = [...arr].sort((a, b) => a - b); return arr.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2; }; -// median([5,6,50,1,-5]) -> 5 -// median([0,10,-2,7]) -> 3.5 +``` + +```js +median([5,6,50,1,-5]) -> 5 +median([0,10,-2,7]) -> 3.5 ``` [⬆ back to top](#table-of-contents) @@ -1598,8 +1837,11 @@ const palindrome = str => { const s = str.toLowerCase().replace(/[\W_]/g,''); return s === s.split('').reverse().join(''); } -// palindrome('taco cat') -> true - ``` +``` + +```js +palindrome('taco cat') -> true +``` [⬆ back to top](#table-of-contents) @@ -1612,8 +1854,11 @@ Use `Array.reduce()` to calculate how many numbers are below the value and how m ```js const percentile = (arr, val) => 100 * arr.reduce((acc,v) => acc + (v < val ? 1 : 0) + (v === val ? 0.5 : 0), 0) / arr.length; -// percentile([1,2,3,4,5,6,7,8,9,10], 6) -> 55 - ``` +``` + +```js +percentile([1,2,3,4,5,6,7,8,9,10], 6) -> 55 +``` [⬆ back to top](#table-of-contents) @@ -1626,12 +1871,15 @@ Use `Array.reduce()` combined with `Array.map()` to iterate over elements and co ```js const powerset = arr => arr.reduce((a, v) => a.concat(a.map(r => [v].concat(r))), [[]]); -// powerset([1,2]) -> [[], [1], [2], [2,1]] +``` + +```js +powerset([1,2]) -> [[], [1], [2], [2,1]] ``` [⬆ back to top](#table-of-contents) -### primes +### primes Generates primes up to a given number, using the Sieve of Eratosthenes. @@ -1639,13 +1887,16 @@ Generate an array from `2` to the given number. Use `Array.filter()` to filter o ```js const primes = num => { - let arr = Array.from({length:num-1}).map((x,i)=> i+2), + let arr = Array.from({length:num-1}).map((x,i)=> i+2), sqroot = Math.floor(Math.sqrt(num)), numsTillSqroot = Array.from({length:sqroot-1}).map((x,i)=> i+2); numsTillSqroot.forEach(x => arr = arr.filter(y => ((y%x)!==0)||(y==x))); - return arr; + return arr; } -// primes(10) -> [2,3,5,7] +``` + +```js +primes(10) -> [2,3,5,7] ``` [⬆ back to top](#table-of-contents) @@ -1658,7 +1909,10 @@ Use `Math.random()` to generate a random number and map it to the desired range, ```js const randomIntegerInRange = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; -// randomIntegerInRange(0, 5) -> 2 +``` + +```js +randomIntegerInRange(0, 5) -> 2 ``` [⬆ back to top](#table-of-contents) @@ -1671,7 +1925,10 @@ Use `Math.random()` to generate a random value, map it to the desired range usin ```js const randomNumberInRange = (min, max) => Math.random() * (max - min) + min; -// randomNumberInRange(2,10) -> 6.0211363285087005 +``` + +```js +randomNumberInRange(2,10) -> 6.0211363285087005 ``` [⬆ back to top](#table-of-contents) @@ -1685,7 +1942,10 @@ Omit the second argument, `decimals` to round to an integer. ```js const round = (n, decimals=0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`); -// round(1.005, 2) -> 1.01 +``` + +```js +round(1.005, 2) -> 1.01 ``` [⬆ back to top](#table-of-contents) @@ -1706,8 +1966,11 @@ const standardDeviation = (arr, usePopulation = false) => { .reduce((acc, val) => acc + val, 0) / (arr.length - (usePopulation ? 0 : 1)) ); }; -// standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample) -// standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population) +``` + +```js +standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample) +standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population) ``` [⬆ back to top](#table-of-contents) @@ -1728,7 +1991,10 @@ const speechSynthesis = message => { msg.voice = window.speechSynthesis.getVoices()[0]; window.speechSynthesis.speak(msg); }; -// speechSynthesis('Hello, World') -> plays the message +``` + +```js +speechSynthesis('Hello, World') -> // plays the message ``` [⬆ back to top](#table-of-contents) @@ -1743,7 +2009,10 @@ Use `fs.writeFile()`, template literals and `JSON.stringify()` to write a `json` ```js const fs = require('fs'); const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2)) -// JSONToFile({test: "is passed"}, 'testJsonFile') -> writes the object to 'testJsonFile.json' +``` + +```js +JSONToFile({test: "is passed"}, 'testJsonFile') -> writes the object to 'testJsonFile.json' ``` [⬆ back to top](#table-of-contents) @@ -1759,15 +2028,16 @@ creating an array from contents of file by `split`ing file content line by line ```js const fs = require('fs'); const readFileLines = filename => fs.readFileSync(filename).toString('UTF8').split('\n'); -/* - contents of test.txt : - line1 - line2 - line3 - ___________________________ - let arr = readFileLines('test.txt') - console.log(arr) // -> ['line1', 'line2', 'line3'] - */ +``` + +```js +contents of test.txt : + line1 + line2 + line3 + ___________________________ +let arr = readFileLines('test.txt') +console.log(arr) // -> ['line1', 'line2', 'line3'] ``` [⬆ back to top](#table-of-contents) @@ -1790,11 +2060,12 @@ const cleanObj = (obj, keysToKeep = [], childIndicator) => { } }) } -/* - const testObj = {a: 1, b: 2, children: {a: 1, b: 2}} - cleanObj(testObj, ["a"],"children") - console.log(testObj)// { a: 1, children : { a: 1}} -*/ +``` + +```js +const testObj = {a: 1, b: 2, children: {a: 1, b: 2}} +cleanObj(testObj, ["a"],"children") +console.log(testObj) // { a: 1, children : { a: 1}} ``` [⬆ back to top](#table-of-contents) @@ -1807,7 +2078,10 @@ Use `Array.reduce()` to create and combine key-value pairs. ```js const objectFromPairs = arr => arr.reduce((a, v) => (a[v[0]] = v[1], a), {}); -// objectFromPairs([['a',1],['b',2]]) -> {a: 1, b: 2} +``` + +```js +objectFromPairs([['a',1],['b',2]]) -> {a: 1, b: 2} ``` [⬆ back to top](#table-of-contents) @@ -1820,7 +2094,10 @@ Use `Object.keys()` and `Array.map()` to iterate over the object's keys and prod ```js const objectToPairs = obj => Object.keys(obj).map(k => [k, obj[k]]); -// objectToPairs({a: 1, b: 2}) -> [['a',1],['b',2]]) +``` + +```js +objectToPairs({a: 1, b: 2}) -> [['a',1],['b',2]]) ``` [⬆ back to top](#table-of-contents) @@ -1843,12 +2120,13 @@ const orderBy = (arr, props, orders) => return acc; }, 0) ); -/* +``` + +```js const users = [{ 'name': 'fred', 'age': 48 },{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 },{ 'name': 'barney', 'age': 34 }]; orderby(users, ['name', 'age'], ['asc', 'desc']) -> [{name: 'barney', age: 36}, {name: 'barney', age: 34}, {name: 'fred', age: 48}, {name: 'fred', age: 40}] orderby(users, ['name', 'age']) -> [{name: 'barney', age: 34}, {name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}] -*/ ``` [⬆ back to top](#table-of-contents) @@ -1862,9 +2140,11 @@ If the property does not exists returns `undefined`. ```js const select = (from, selector) => selector.split('.').reduce((prev, cur) => prev && prev[cur], from); +``` -// const obj = {selector: {to: {val: 'val to select'}}}; -// select(obj, 'selector.to.val'); -> 'val to select' +```js +const obj = {selector: {to: {val: 'val to select'}}}; +select(obj, 'selector.to.val'); -> 'val to select' ``` [⬆ back to top](#table-of-contents) @@ -1877,11 +2157,12 @@ Use `Object.assign()` and an empty object (`{}`) to create a shallow clone of th ```js const shallowClone = obj => Object.assign({}, obj); -/* +``` + +```js const a = { x: true, y: 1 }; const b = shallowClone(a); a === b -> false -*/ ``` [⬆ back to top](#table-of-contents) @@ -1891,10 +2172,13 @@ a === b -> false Checks if the predicate (second argument) is truthy on all elements of a collection (first argument). Use `Array.every()` to check if each passed object has the specified property and if it returns a truthy value. - + ```js const truthCheckCollection = (collection, pre) => (collection.every(obj => obj[pre])); -// truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") -> true +``` + +```js +truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") -> true ``` [⬆ back to top](#table-of-contents) @@ -1915,7 +2199,10 @@ const anagrams = str => { return str.split('').reduce((acc, letter, i) => acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)), []); }; -// anagrams('abc') -> ['abc','acb','bac','bca','cab','cba'] +``` + +```js +anagrams('abc') -> ['abc','acb','bac','bca','cab','cba'] ``` [⬆ back to top](#table-of-contents) @@ -1930,8 +2217,11 @@ Omit the `lowerRest` parameter to keep the rest of the string intact, or set it ```js const capitalize = ([first,...rest], lowerRest = false) => first.toUpperCase() + (lowerRest ? rest.join('').toLowerCase() : rest.join('')); -// capitalize('myName') -> 'MyName' -// capitalize('myName', true) -> 'Myname' +``` + +```js +capitalize('fooBar') -> 'FooBar' +capitalize('fooBar', true) -> 'Foobar' ``` [⬆ back to top](#table-of-contents) @@ -1944,7 +2234,10 @@ Use `replace()` to match the first character of each word and `toUpperCase()` to ```js const capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase()); -// capitalizeEveryWord('hello world!') -> 'Hello World!' +``` + +```js +capitalizeEveryWord('hello world!') -> 'Hello World!' ``` [⬆ back to top](#table-of-contents) @@ -1957,8 +2250,11 @@ Use a regular expression to count the number of vowels `(A, E, I, O, U)` in a `s ```js const countVowels = str => (str.match(/[aeiou]/ig) || []).length; -// countVowels('foobar') -> 3 -// countVowels('gym') -> 0 +``` + +```js +countVowels('foobar') -> 3 +countVowels('gym') -> 0 ``` [⬆ back to top](#table-of-contents) @@ -1971,7 +2267,10 @@ Use `replace()` to escape special characters. ```js const escapeRegExp = str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); -// escapeRegExp('(test)') -> \\(test\\) +``` + +```js +escapeRegExp('(test)') -> \\(test\\) ``` [⬆ back to top](#table-of-contents) @@ -1987,9 +2286,12 @@ Omit the second argument to use a default separator of `_`. const fromCamelCase = (str, separator = '_') => str.replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2') .replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + separator + '$2').toLowerCase(); -// fromCamelCase('someDatabaseFieldName', ' ') -> 'some database field name' -// fromCamelCase('someLabelThatNeedsToBeCamelized', '-') -> 'some-label-that-needs-to-be-camelized' -// fromCamelCase('someJavascriptProperty', '_') -> 'some_javascript_property' +``` + +```js +fromCamelCase('someDatabaseFieldName', ' ') -> 'some database field name' +fromCamelCase('someLabelThatNeedsToBeCamelized', '-') -> 'some-label-that-needs-to-be-camelized' +fromCamelCase('someJavascriptProperty', '_') -> 'some_javascript_property' ``` [⬆ back to top](#table-of-contents) @@ -2004,8 +2306,11 @@ If no string is provided the default is `""` and the default number of times is const repeatString = (str="",num=2) => { return num >= 0 ? str.repeat(num) : str; } -// repeatString("abc",3) -> 'abcabcabc' -// repeatString("abc") -> 'abcabc' +``` + +```js +repeatString("abc",3) -> 'abcabcabc' +repeatString("abc") -> 'abcabc' ``` [⬆ back to top](#table-of-contents) @@ -2019,7 +2324,10 @@ Combine characters to get a string using `join('')`. ```js const reverseString = str => str.split('').reverse().join(''); -// reverseString('foobar') -> 'raboof' +``` + +```js +reverseString('foobar') -> 'raboof' ``` [⬆ back to top](#table-of-contents) @@ -2033,7 +2341,10 @@ Split the string using `split('')`, `Array.sort()` utilizing `localeCompare()`, ```js const sortCharactersInString = str => str.split('').sort((a, b) => a.localeCompare(b)).join(''); -// sortCharactersInString('cabbage') -> 'aabbceg' +``` + +```js +sortCharactersInString('cabbage') -> 'aabbceg' ``` [⬆ back to top](#table-of-contents) @@ -2052,10 +2363,13 @@ const toCamelCase = str => { .join(''); return s.slice(0,1).toLowerCase() + s.slice(1) } -// toCamelCase("some_database_field_name") -> 'someDatabaseFieldName' -// toCamelCase("Some label that needs to be camelized") -> 'someLabelThatNeedsToBeCamelized' -// toCamelCase("some-javascript-property") -> 'someJavascriptProperty' -// toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") -> 'someMixedStringWithSpacesUnderscoresAndHyphens' +``` + +```js +toCamelCase("some_database_field_name") -> 'someDatabaseFieldName' +toCamelCase("Some label that needs to be camelized") -> 'someLabelThatNeedsToBeCamelized' +toCamelCase("some-javascript-property") -> 'someJavascriptProperty' +toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") -> 'someMixedStringWithSpacesUnderscoresAndHyphens' ``` [⬆ back to top](#table-of-contents) @@ -2072,11 +2386,14 @@ const toKebabCase = str => str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) .map(x => x.toLowerCase()) .join('-'); -// toKebabCase("camelCase") -> 'camel-case' -// toKebabCase("some text") -> 'some-text' -// toKebabCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some-mixed-string-with-spaces-underscores-and-hyphens' -// toKebabCase("AllThe-small Things") -> "all-the-small-things" -// toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-xml-and-html" +``` + +```js +toKebabCase("camelCase") -> 'camel-case' +toKebabCase("some text") -> 'some-text' +toKebabCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some-mixed-string-with-spaces-underscores-and-hyphens' +toKebabCase("AllThe-small Things") -> "all-the-small-things" +toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-xml-and-html" ``` [⬆ back to top](#table-of-contents) @@ -2093,12 +2410,15 @@ const toSnakeCase = str =>{ str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) .map(x => x.toLowerCase()) .join('_'); -// toSnakeCase("camelCase") -> 'camel_case' -// toSnakeCase("some text") -> 'some_text' -// toSnakeCase("some-javascript-property") -> 'some_javascript_property' -// toSnakeCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some_mixed_string_with_spaces_underscores_and_hyphens' -// toKebabCase("AllThe-small Things") -> "all_the_smal_things" -// toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html" +``` + +```js +toSnakeCase("camelCase") -> 'camel_case' +toSnakeCase("some text") -> 'some_text' +toSnakeCase("some-javascript-property") -> 'some_javascript_property' +toSnakeCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some_mixed_string_with_spaces_underscores_and_hyphens' +toSnakeCase("AllThe-small Things") -> "all_the_smal_things" +toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html" ``` [⬆ back to top](#table-of-contents) @@ -2113,7 +2433,10 @@ Return the string truncated to the desired length, with `...` appended to the en ```js const truncateString = (str, num) => str.length > num ? str.slice(0, num > 3 ? num - 3 : num) + '...' : str; -// truncateString('boomerang', 7) -> 'boom...' +``` + +```js +truncateString('boomerang', 7) -> 'boom...' ``` [⬆ back to top](#table-of-contents) @@ -2127,8 +2450,11 @@ Omit the second argument to use the default regex. ```js const words = (str, pattern = /[^a-zA-Z-]+/) => str.split(pattern).filter(Boolean); -// words("I love javaScript!!") -> ["I", "love", "javaScript"] -// words("python, javaScript & coffee") -> ["python", "javaScript", "coffee"] +``` + +```js +words("I love javaScript!!") -> ["I", "love", "javaScript"] +words("python, javaScript & coffee") -> ["python", "javaScript", "coffee"] ``` [⬆ back to top](#table-of-contents) @@ -2142,7 +2468,10 @@ Use `Array.find()` to return the first non `null`/`undefined` argument. ```js const coalesce = (...args) => args.find(_ => ![undefined, null].includes(_)) -// coalesce(null,undefined,"",NaN, "Waldo") -> "" +``` + +```js +coalesce(null,undefined,"",NaN, "Waldo") -> "" ``` [⬆ back to top](#table-of-contents) @@ -2155,8 +2484,11 @@ Use `Array.find()` to return the first argument that returns `true` from the pro ```js const coalesceFactory = valid => (...args) => args.find(valid); -// const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_)) -// customCoalesce(undefined, null, NaN, "", "Waldo") //-> "Waldo" +``` + +```js +const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_)) +customCoalesce(undefined, null, NaN, "", "Waldo") // "Waldo" ``` [⬆ back to top](#table-of-contents) @@ -2170,8 +2502,11 @@ Use `Array.map()`, `split()` and `Array.join()` to join the mapped array for con ```js const extendHex = shortHex => '#' + shortHex.slice(shortHex.startsWith('#') ? 1 : 0).split('').map(x => x+x).join('') -// extendHex('#03f') -> '#0033ff' -// extendHex('05a') -> '#0055aa' +``` + +```js +extendHex('#03f') -> '#0033ff' +extendHex('05a') -> '#0055aa' ``` [⬆ back to top](#table-of-contents) @@ -2185,7 +2520,10 @@ Returns lowercased constructor name of value, "undefined" or "null" if value is ```js const getType = v => v === undefined ? 'undefined' : v === null ? 'null' : v.constructor.name.toLowerCase(); -// getType(new Set([1,2,3])) -> "set" +``` + +```js +getType(new Set([1,2,3])) -> "set" ``` [⬆ back to top](#table-of-contents) @@ -2208,10 +2546,12 @@ const hexToRGB = hex => { + ((h & (alpha ? 0x0000ff00 : 0x0000ff)) >>> (alpha ? 8 : 0)) + (alpha ? `, ${(h & 0x000000ff)}` : '') + ')'; }; -// hexToRGB('#27ae60ff') -> 'rgba(39, 174, 96, 255)' -// hexToRGB('27ae60') -> 'rgb(39, 174, 96)' -// hexToRGB('#fff') -> 'rgb(255, 255, 255)' +``` +```js +hexToRGB('#27ae60ff') -> 'rgba(39, 174, 96, 255)' +hexToRGB('27ae60') -> 'rgb(39, 174, 96)' +hexToRGB('#fff') -> 'rgb(255, 255, 255)' ``` [⬆ back to top](#table-of-contents) @@ -2224,8 +2564,11 @@ Use `Array.isArray()` to check if a value is classified as an array. ```js const isArray = val => !!val && Array.isArray(val); -// isArray(null) -> false -// isArray([1]) -> true +``` + +```js +isArray(null) -> false +isArray([1]) -> true ``` [⬆ back to top](#table-of-contents) @@ -2238,8 +2581,11 @@ Use `typeof` to check if a value is classified as a boolean primitive. ```js const isBoolean = val => typeof val === 'boolean'; -// isBoolean(null) -> false -// isBoolean(false) -> true +``` + +```js +isBoolean(null) -> false +isBoolean(false) -> true ``` [⬆ back to top](#table-of-contents) @@ -2252,8 +2598,11 @@ Use `typeof` to check if a value is classified as a function primitive. ```js const isFunction = val => val && typeof val === 'function'; -// isFunction('x') -> false -// isFunction(x => x) -> true +``` + +```js +isFunction('x') -> false +isFunction(x => x) -> true ``` [⬆ back to top](#table-of-contents) @@ -2266,10 +2615,12 @@ Use `typeof` to check if a value is classified as a number primitive. ```js const isNumber = val => typeof val === 'number'; -// isNumber('1') -> false -// isNumber(1) -> true ``` +```js +isNumber('1') -> false +isNumber(1) -> true +``` [⬆ back to top](#table-of-contents) ### isString @@ -2280,8 +2631,11 @@ Use `typeof` to check if a value is classified as a string primitive. ```js const isString = val => typeof val === 'string'; -// isString(10) -> false -// isString('10') -> true +``` + +```js +isString(10) -> false +isString('10') -> true ``` [⬆ back to top](#table-of-contents) @@ -2294,8 +2648,11 @@ Use `typeof` to check if a value is classified as a symbol primitive. ```js const isSymbol = val => typeof val === 'symbol'; -// isSymbol('x') -> false -// isSymbol(Symbol('x')) -> true +``` + +```js +isSymbol('x') -> false +isSymbol(Symbol('x')) -> true ``` [⬆ back to top](#table-of-contents) @@ -2304,13 +2661,16 @@ const isSymbol = val => typeof val === 'symbol'; Generates a random hexadecimal color code. -Use `Math.random` to generate a random 24-bit(6x4bits) hexadecimal number. Use bit shifting and then convert it to an hexadecimal String using `toString(16)`. +Use `Math.random` to generate a random 24-bit(6x4bits) hexadecimal number. Use bit shifting and then convert it to an hexadecimal String using `toString(16)`. ```js const randomHexColorCode = () => '#'+(Math.random()*0xFFFFFF<<0).toString(16); -// randomHexColorCode() -> "#e34155" -// randomHexColorCode() -> "#fd73a6" -// randomHexColorCode() -> "#4144c6" +``` + +```js +randomHexColorCode() -> "#e34155" +randomHexColorCode() -> "#fd73a6" +randomHexColorCode() -> "#4144c6" ``` [⬆ back to top](#table-of-contents) @@ -2323,7 +2683,10 @@ Convert given RGB parameters to hexadecimal string using bitwise left-shift oper ```js const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0'); -// RGBToHex(255, 165, 1) -> 'ffa501' +``` + +```js +RGBToHex(255, 165, 1) -> 'ffa501' ``` [⬆ back to top](#table-of-contents) @@ -2339,8 +2702,11 @@ const timeTaken = callback => { console.time('timeTaken'); const r = callback(); console.timeEnd('timeTaken'); return r; }; -// timeTaken(() => Math.pow(2, 10)) -> 1024 -// (logged): timeTaken: 0.02099609375ms +``` + +```js +timeTaken(() => Math.pow(2, 10)) -> 1024 +(logged): timeTaken: 0.02099609375ms ``` [⬆ back to top](#table-of-contents) @@ -2351,7 +2717,10 @@ Use `toLocaleString()` to convert a float-point arithmetic to the [Decimal mark] ```js const toDecimalMark = num => num.toLocaleString("en-US"); -// toDecimalMark(12305030388.9087) -> "12,305,030,388.9087" +``` + +```js +toDecimalMark(12305030388.9087) -> "12,305,030,388.9087" ``` [⬆ back to top](#table-of-contents) @@ -2371,7 +2740,10 @@ const toOrdinalSuffix = num => { tPattern = [11, 12, 13, 14, 15, 16, 17, 18, 19]; return oPattern.includes(digits[0]) && !tPattern.includes(digits[1]) ? int + ordinals[digits[0] - 1] : int + ordinals[3]; }; -// toOrdinalSuffix("123") -> "123rd" +``` + +```js +toOrdinalSuffix("123") -> "123rd" ``` [⬆ back to top](#table-of-contents) @@ -2387,7 +2759,10 @@ const UUIDGenerator = () => ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) ); -// UUIDGenerator() -> '7982fcfe-5721-4632-bede-6000885be57d' +``` + +```js +UUIDGenerator() -> '7982fcfe-5721-4632-bede-6000885be57d' ``` [⬆ back to top](#table-of-contents) @@ -2402,7 +2777,10 @@ Use `Number()` to check if the coercion holds. ```js const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n; -// validateNumber('10') -> true +``` + +```js +validateNumber('10') -> true ``` [⬆ back to top](#table-of-contents) From f005bb55f8ac4330011ca98abe5de6b7e4abcba0 Mon Sep 17 00:00:00 2001 From: Angelos Chalaris Date: Wed, 27 Dec 2017 12:24:40 +0200 Subject: [PATCH 11/36] Updated query selector to match the proper pre elements --- static-parts/index-start.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static-parts/index-start.html b/static-parts/index-start.html index 3a926ab47..191222d71 100644 --- a/static-parts/index-start.html +++ b/static-parts/index-start.html @@ -33,7 +33,7 @@ }) } function clipboard() { - const snippets = document.querySelectorAll("pre"); + const snippets = document.querySelectorAll(":not(pre) + pre"); snippets.forEach(element => { const button = document.createElement("button"); button.innerHTML = "Copy to clipboard"; From e436553169b25daa289d2b2f55fcb9ce6c48ae5f Mon Sep 17 00:00:00 2001 From: Angelos Chalaris Date: Wed, 27 Dec 2017 13:03:11 +0200 Subject: [PATCH 12/36] Updated the flavor file to avoid a styling problem --- docs/mini/flavor.scss | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/mini/flavor.scss b/docs/mini/flavor.scss index 1ac2b1f8c..bed527130 100644 --- a/docs/mini/flavor.scss +++ b/docs/mini/flavor.scss @@ -114,7 +114,10 @@ code, pre, kbd, code *, pre *, kbd *, code[class*="language-"], pre[class*="lang font-family: 'Inconsolata', Menlo, Consolas, monospace !important; } code, kbd { font-size: 1em; } -code { transform: scale(1); } /* Deals with the issue described in #243 */ +code { + padding: 0; // Should make the first line's left padding the same as all other lines and avoid that annoying little step. + transform: scale(1); /* Deals with the issue described in #243 */ +} pre { font-size: 1rem; border: 0.0625rem solid var(--secondary-border-color); border-radius: var(--universal-border-radius);} .group{position:relative;margin-top:2em;margin-bottom:-1em} .search{font-size:14px;margin-top:-.1em;display:block;width:100%;border:none;border-bottom:1px solid var(--nav-link-color)} From 67cf77655cb6391883573eaa05122b044e6c44b4 Mon Sep 17 00:00:00 2001 From: Angelos Chalaris Date: Wed, 27 Dec 2017 16:06:16 +0200 Subject: [PATCH 13/36] Updated examples --- snippets/JSONToDate.md | 2 +- snippets/JSONToFile.md | 2 +- snippets/RGBToHex.md | 2 +- snippets/UUIDGenerator.md | 2 +- snippets/anagrams.md | 2 +- snippets/arrayAverage.md | 2 +- snippets/arrayGcd.md | 4 ++-- snippets/arrayLcm.md | 4 ++-- snippets/arrayMax.md | 2 +- snippets/arrayMin.md | 2 +- snippets/arraySum.md | 2 +- snippets/bottomVisible.md | 2 +- snippets/capitalize.md | 4 ++-- snippets/capitalizeEveryWord.md | 2 +- snippets/chunk.md | 2 +- snippets/clampNumber.md | 6 +++--- snippets/coalesce.md | 2 +- snippets/collatz.md | 4 ++-- snippets/compact.md | 2 +- snippets/compose.md | 2 +- snippets/countOccurrences.md | 2 +- snippets/countVowels.md | 4 ++-- snippets/currentURL.md | 2 +- snippets/curry.md | 4 ++-- snippets/deepFlatten.md | 2 +- snippets/detectDeviceType.md | 4 ++-- snippets/difference.md | 2 +- snippets/differenceWith.md | 2 +- snippets/digitize.md | 2 +- snippets/distance.md | 2 +- snippets/distinctValuesOfArray.md | 2 +- snippets/dropElements.md | 2 +- snippets/dropRight.md | 6 +++--- snippets/elementIsVisibleInViewport.md | 4 ++-- snippets/escapeRegExp.md | 2 +- snippets/everyNth.md | 2 +- snippets/extendHex.md | 4 ++-- snippets/factorial.md | 2 +- snippets/fibonacci.md | 2 +- snippets/fibonacciCountUntilNum.md | 2 +- snippets/fibonacciUntilNum.md | 2 +- snippets/filterNonUnique.md | 2 +- snippets/flatten.md | 2 +- snippets/flattenDepth.md | 2 +- snippets/fromCamelCase.md | 6 +++--- snippets/functionName.md | 2 +- snippets/gcd.md | 2 +- snippets/getDaysDiffBetweenDates.md | 2 +- snippets/getScrollPosition.md | 2 +- snippets/getType.md | 2 +- snippets/getURLParameters.md | 2 +- snippets/groupBy.md | 4 ++-- snippets/hammingDistance.md | 2 +- snippets/head.md | 2 +- snippets/hexToRGB.md | 6 +++--- snippets/inRange.md | 8 ++++---- snippets/initial.md | 2 +- snippets/initialize2DArray.md | 2 +- snippets/initializeArrayWithRange.md | 4 ++-- snippets/initializeArrayWithValues.md | 2 +- snippets/intersection.md | 2 +- snippets/isArmstrongNumber.md | 6 +++--- snippets/isArray.md | 4 ++-- snippets/isBoolean.md | 4 ++-- snippets/isDivisible.md | 2 +- snippets/isEven.md | 2 +- snippets/isFunction.md | 4 ++-- snippets/isNumber.md | 4 ++-- snippets/isPrime.md | 4 ++-- snippets/isString.md | 4 ++-- snippets/isSymbol.md | 4 ++-- snippets/last.md | 2 +- snippets/lcm.md | 2 +- snippets/median.md | 4 ++-- snippets/negate.md | 4 ++-- snippets/nthElement.md | 4 ++-- snippets/objectFromPairs.md | 2 +- snippets/objectToPairs.md | 2 +- snippets/orderBy.md | 4 ++-- snippets/palindrome.md | 2 +- snippets/percentile.md | 2 +- snippets/pick.md | 2 +- snippets/pipe.md | 2 +- snippets/powerset.md | 2 +- snippets/primes.md | 2 +- snippets/promisify.md | 2 +- snippets/pull.md | 4 ++-- snippets/pullAtIndex.md | 4 ++-- snippets/pullAtValue.md | 4 ++-- snippets/randomHexColorCode.md | 6 +++--- snippets/randomIntegerInRange.md | 2 +- snippets/randomNumberInRange.md | 2 +- snippets/readFileLines.md | 2 +- snippets/remove.md | 2 +- snippets/repeatString.md | 4 ++-- snippets/reverseString.md | 2 +- snippets/round.md | 2 +- snippets/runPromisesInSeries.md | 2 +- snippets/sample.md | 2 +- snippets/select.md | 2 +- snippets/shallowClone.md | 2 +- snippets/shuffle.md | 2 +- snippets/similarity.md | 2 +- snippets/sortCharactersInString.md | 2 +- snippets/speechSynthesis.md | 2 +- snippets/spreadOver.md | 4 ++-- snippets/standardDeviation.md | 4 ++-- snippets/symmetricDifference.md | 2 +- snippets/tail.md | 4 ++-- snippets/take.md | 4 ++-- snippets/takeRight.md | 4 ++-- snippets/timeTaken.md | 2 +- snippets/toCamelCase.md | 8 ++++---- snippets/toDecimalMark.md | 2 +- snippets/toEnglishDate.md | 2 +- snippets/toKebabCase.md | 10 +++++----- snippets/toOrdinalSuffix.md | 2 +- snippets/toSnakeCase.md | 12 ++++++------ snippets/truncateString.md | 2 +- snippets/truthCheckCollection.md | 2 +- snippets/union.md | 2 +- snippets/validateNumber.md | 2 +- snippets/without.md | 2 +- snippets/words.md | 4 ++-- snippets/zip.md | 4 ++-- snippets/zipObject.md | 4 ++-- 126 files changed, 187 insertions(+), 187 deletions(-) diff --git a/snippets/JSONToDate.md b/snippets/JSONToDate.md index 38e9219f9..f2cbb095b 100644 --- a/snippets/JSONToDate.md +++ b/snippets/JSONToDate.md @@ -12,5 +12,5 @@ const JSONToDate = arr => { ``` ```js -JSONToDate(/Date(1489525200000)/) -> "14/3/2017" +JSONToDate(/Date(1489525200000)/) // "14/3/2017" ``` diff --git a/snippets/JSONToFile.md b/snippets/JSONToFile.md index 300b47e1f..2e88f336d 100644 --- a/snippets/JSONToFile.md +++ b/snippets/JSONToFile.md @@ -10,5 +10,5 @@ const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.stri ``` ```js -JSONToFile({test: "is passed"}, 'testJsonFile') -> writes the object to 'testJsonFile.json' +JSONToFile({test: "is passed"}, 'testJsonFile') // writes the object to 'testJsonFile.json' ``` diff --git a/snippets/RGBToHex.md b/snippets/RGBToHex.md index f7568f70f..a7f045ab7 100644 --- a/snippets/RGBToHex.md +++ b/snippets/RGBToHex.md @@ -9,5 +9,5 @@ const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6 ``` ```js -RGBToHex(255, 165, 1) -> 'ffa501' +RGBToHex(255, 165, 1) // 'ffa501' ``` diff --git a/snippets/UUIDGenerator.md b/snippets/UUIDGenerator.md index 87300e5ed..2fc772940 100644 --- a/snippets/UUIDGenerator.md +++ b/snippets/UUIDGenerator.md @@ -12,5 +12,5 @@ const UUIDGenerator = () => ``` ```js -UUIDGenerator() -> '7982fcfe-5721-4632-bede-6000885be57d' +UUIDGenerator() // '7982fcfe-5721-4632-bede-6000885be57d' ``` diff --git a/snippets/anagrams.md b/snippets/anagrams.md index 2238c4a5f..82684871c 100644 --- a/snippets/anagrams.md +++ b/snippets/anagrams.md @@ -16,5 +16,5 @@ const anagrams = str => { ``` ```js -anagrams('abc') -> ['abc','acb','bac','bca','cab','cba'] +anagrams('abc') // ['abc','acb','bac','bca','cab','cba'] ``` diff --git a/snippets/arrayAverage.md b/snippets/arrayAverage.md index 92c54518b..1cc3cecb4 100644 --- a/snippets/arrayAverage.md +++ b/snippets/arrayAverage.md @@ -9,5 +9,5 @@ const arrayAverage = arr => arr.reduce((acc, val) => acc + val, 0) / arr.length; ``` ```js -arrayAverage([1,2,3]) -> 2 +arrayAverage([1,2,3]) // 2 ``` diff --git a/snippets/arrayGcd.md b/snippets/arrayGcd.md index df657f31a..975b7ecc4 100644 --- a/snippets/arrayGcd.md +++ b/snippets/arrayGcd.md @@ -12,6 +12,6 @@ const arrayGcd = arr =>{ ``` ```js -arrayGcd([1,2,3,4,5]) -> 1 -arrayGcd([4,8,12]) -> 4 +arrayGcd([1,2,3,4,5]) // 1 +arrayGcd([4,8,12]) // 4 ``` diff --git a/snippets/arrayLcm.md b/snippets/arrayLcm.md index fd82831f5..e50555e2e 100644 --- a/snippets/arrayLcm.md +++ b/snippets/arrayLcm.md @@ -13,6 +13,6 @@ const arrayLcm = arr =>{ ``` ```js -arrayLcm([1,2,3,4,5]) -> 60 -arrayLcm([4,8,12]) -> 24 +arrayLcm([1,2,3,4,5]) // 60 +arrayLcm([4,8,12]) // 24 ``` diff --git a/snippets/arrayMax.md b/snippets/arrayMax.md index 3e1b5c5e8..32178d533 100644 --- a/snippets/arrayMax.md +++ b/snippets/arrayMax.md @@ -9,5 +9,5 @@ const arrayMax = arr => Math.max(...arr); ``` ```js -arrayMax([10, 1, 5]) -> 10 +arrayMax([10, 1, 5]) // 10 ``` diff --git a/snippets/arrayMin.md b/snippets/arrayMin.md index 171d60977..1e256b388 100644 --- a/snippets/arrayMin.md +++ b/snippets/arrayMin.md @@ -9,5 +9,5 @@ const arrayMin = arr => Math.min(...arr); ``` ```js -arrayMin([10, 1, 5]) -> 1 +arrayMin([10, 1, 5]) // 1 ``` diff --git a/snippets/arraySum.md b/snippets/arraySum.md index 9c3178d35..536a4eb81 100644 --- a/snippets/arraySum.md +++ b/snippets/arraySum.md @@ -9,5 +9,5 @@ const arraySum = arr => arr.reduce((acc, val) => acc + val, 0); ``` ```js -arraySum([1,2,3,4]) -> 10 +arraySum([1,2,3,4]) // 10 ``` diff --git a/snippets/bottomVisible.md b/snippets/bottomVisible.md index 485f1879f..844d11b31 100644 --- a/snippets/bottomVisible.md +++ b/snippets/bottomVisible.md @@ -10,5 +10,5 @@ const bottomVisible = () => ``` ```js -// bottomVisible() -> true +// bottomVisible() // true ``` diff --git a/snippets/capitalize.md b/snippets/capitalize.md index 435b69202..2b8a6e216 100644 --- a/snippets/capitalize.md +++ b/snippets/capitalize.md @@ -11,6 +11,6 @@ const capitalize = ([first,...rest], lowerRest = false) => ``` ```js -capitalize('fooBar') -> 'FooBar' -capitalize('fooBar', true) -> 'Foobar' +capitalize('fooBar') // 'FooBar' +capitalize('fooBar', true) // 'Foobar' ``` diff --git a/snippets/capitalizeEveryWord.md b/snippets/capitalizeEveryWord.md index b607f8f58..dd3193c3e 100644 --- a/snippets/capitalizeEveryWord.md +++ b/snippets/capitalizeEveryWord.md @@ -9,5 +9,5 @@ const capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperC ``` ```js -capitalizeEveryWord('hello world!') -> 'Hello World!' +capitalizeEveryWord('hello world!') // 'Hello World!' ``` diff --git a/snippets/chunk.md b/snippets/chunk.md index 122712351..f27fe965c 100644 --- a/snippets/chunk.md +++ b/snippets/chunk.md @@ -12,5 +12,5 @@ const chunk = (arr, size) => ``` ```js -chunk([1,2,3,4,5], 2) -> [[1,2],[3,4],[5]] +chunk([1,2,3,4,5], 2) // [[1,2],[3,4],[5]] ``` diff --git a/snippets/clampNumber.md b/snippets/clampNumber.md index 907b54729..3ae9eda45 100644 --- a/snippets/clampNumber.md +++ b/snippets/clampNumber.md @@ -14,7 +14,7 @@ const clampNumber = (num, lower, upper) => { ``` ```js -clampNumber(2, 3, 5) -> 3 -clampNumber(1, -1, -5) -> -1 -clampNumber(3, 2, 4) -> 3 +clampNumber(2, 3, 5) // 3 +clampNumber(1, -1, -5) // -1 +clampNumber(3, 2, 4) // 3 ``` diff --git a/snippets/coalesce.md b/snippets/coalesce.md index 9762a363f..c112c77d4 100644 --- a/snippets/coalesce.md +++ b/snippets/coalesce.md @@ -9,5 +9,5 @@ const coalesce = (...args) => args.find(_ => ![undefined, null].includes(_)) ``` ```js -coalesce(null,undefined,"",NaN, "Waldo") -> "" +coalesce(null,undefined,"",NaN, "Waldo") // "" ``` diff --git a/snippets/collatz.md b/snippets/collatz.md index fc05b2a5d..de67f674c 100644 --- a/snippets/collatz.md +++ b/snippets/collatz.md @@ -9,6 +9,6 @@ const collatz = n => (n % 2 == 0) ? (n / 2) : (3 * n + 1); ``` ```js -collatz(8) -> 4 -collatz(5) -> 16 +collatz(8) // 4 +collatz(5) // 16 ``` diff --git a/snippets/compact.md b/snippets/compact.md index 2a9528772..07f4e9900 100644 --- a/snippets/compact.md +++ b/snippets/compact.md @@ -9,5 +9,5 @@ const compact = arr => arr.filter(Boolean); ``` ```js -compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) -> [ 1, 2, 3, 'a', 's', 34 ] +compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) // [ 1, 2, 3, 'a', 's', 34 ] ``` diff --git a/snippets/compose.md b/snippets/compose.md index dfd40f814..c271a50e8 100644 --- a/snippets/compose.md +++ b/snippets/compose.md @@ -13,5 +13,5 @@ const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args))); const add5 = x => x + 5 const multiply = (x, y) => x * y const multiplyAndAdd5 = compose(add5, multiply) -multiplyAndAdd5(5, 2) -> 15 +multiplyAndAdd5(5, 2) // 15 ``` diff --git a/snippets/countOccurrences.md b/snippets/countOccurrences.md index 2c1463b02..d68c83acf 100644 --- a/snippets/countOccurrences.md +++ b/snippets/countOccurrences.md @@ -9,5 +9,5 @@ const countOccurrences = (arr, value) => arr.reduce((a, v) => v === value ? a + ``` ```js -countOccurrences([1,1,2,1,2,3], 1) -> 3 +countOccurrences([1,1,2,1,2,3], 1) // 3 ``` diff --git a/snippets/countVowels.md b/snippets/countVowels.md index 47c683eb8..50cf6cafa 100644 --- a/snippets/countVowels.md +++ b/snippets/countVowels.md @@ -9,6 +9,6 @@ const countVowels = str => (str.match(/[aeiou]/ig) || []).length; ``` ```js -countVowels('foobar') -> 3 -countVowels('gym') -> 0 +countVowels('foobar') // 3 +countVowels('gym') // 0 ``` diff --git a/snippets/currentURL.md b/snippets/currentURL.md index 7e8965d92..0fab76ab3 100644 --- a/snippets/currentURL.md +++ b/snippets/currentURL.md @@ -9,5 +9,5 @@ const currentURL = () => window.location.href; ``` ```js -currentUrl() -> 'https://google.com' +currentUrl() // 'https://google.com' ``` diff --git a/snippets/curry.md b/snippets/curry.md index f1806d395..c316acff2 100644 --- a/snippets/curry.md +++ b/snippets/curry.md @@ -15,6 +15,6 @@ const curry = (fn, arity = fn.length, ...args) => ``` ```js -curry(Math.pow)(2)(10) -> 1024 -curry(Math.min, 3)(10)(50)(2) -> 2 +curry(Math.pow)(2)(10) // 1024 +curry(Math.min, 3)(10)(50)(2) // 2 ``` diff --git a/snippets/deepFlatten.md b/snippets/deepFlatten.md index cea888992..c6c9d2807 100644 --- a/snippets/deepFlatten.md +++ b/snippets/deepFlatten.md @@ -11,5 +11,5 @@ const deepFlatten = arr => [].concat(...arr.map(v => Array.isArray(v) ? deepFlat ``` ```js -deepFlatten([1,[2],[[3],4],5]) -> [1,2,3,4,5] +deepFlatten([1,[2],[[3],4],5]) // [1,2,3,4,5] ``` diff --git a/snippets/detectDeviceType.md b/snippets/detectDeviceType.md index 64888d44e..b262e194d 100644 --- a/snippets/detectDeviceType.md +++ b/snippets/detectDeviceType.md @@ -9,6 +9,6 @@ const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobi ``` ```js -detectDeviceType() -> "Mobile" -detectDeviceType() -> "Desktop" +detectDeviceType() // "Mobile" +detectDeviceType() // "Desktop" ``` diff --git a/snippets/difference.md b/snippets/difference.md index dce891e60..486d4b050 100644 --- a/snippets/difference.md +++ b/snippets/difference.md @@ -9,5 +9,5 @@ const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has ``` ```js -difference([1,2,3], [1,2,4]) -> [3] +difference([1,2,3], [1,2,4]) // [3] ``` diff --git a/snippets/differenceWith.md b/snippets/differenceWith.md index c199a62bd..f5ad345d6 100644 --- a/snippets/differenceWith.md +++ b/snippets/differenceWith.md @@ -9,5 +9,5 @@ const differenceWith = (arr, val, comp) => arr.filter(a => !val.find(b => comp(a ``` ```js -differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) -> [1, 1.2] +differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) // [1, 1.2] ``` diff --git a/snippets/digitize.md b/snippets/digitize.md index b9d6cffbd..9d52fd04b 100644 --- a/snippets/digitize.md +++ b/snippets/digitize.md @@ -10,5 +10,5 @@ const digitize = n => [...''+n].map(i => parseInt(i)); ``` ```js -differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) -> [1, 1.2] +differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) // [1, 1.2] ``` diff --git a/snippets/distance.md b/snippets/distance.md index 543c763a6..bfc29b8dc 100644 --- a/snippets/distance.md +++ b/snippets/distance.md @@ -9,5 +9,5 @@ const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0); ``` ```js -distance(1,1, 2,3) -> 2.23606797749979 +distance(1,1, 2,3) // 2.23606797749979 ``` diff --git a/snippets/distinctValuesOfArray.md b/snippets/distinctValuesOfArray.md index 374e24cef..509738a40 100644 --- a/snippets/distinctValuesOfArray.md +++ b/snippets/distinctValuesOfArray.md @@ -9,5 +9,5 @@ const distinctValuesOfArray = arr => [...new Set(arr)]; ``` ```js -distinctValuesOfArray([1,2,2,3,4,4,5]) -> [1,2,3,4,5] +distinctValuesOfArray([1,2,2,3,4,4,5]) // [1,2,3,4,5] ``` diff --git a/snippets/dropElements.md b/snippets/dropElements.md index 064a16d22..a9632c634 100644 --- a/snippets/dropElements.md +++ b/snippets/dropElements.md @@ -13,5 +13,5 @@ const dropElements = (arr, func) => { ``` ```js -dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4] +dropElements([1, 2, 3, 4], n => n >= 3) // [3,4] ``` diff --git a/snippets/dropRight.md b/snippets/dropRight.md index 11d30d198..cdf8fd458 100644 --- a/snippets/dropRight.md +++ b/snippets/dropRight.md @@ -9,7 +9,7 @@ const dropRight = (arr, n = 1) => arr.slice(0, -n); ``` ```js -dropRight([1,2,3]) -> [1,2] -dropRight([1,2,3], 2) -> [1] -dropRight([1,2,3], 42) -> [] +dropRight([1,2,3]) // [1,2] +dropRight([1,2,3], 2) // [1] +dropRight([1,2,3], 42) // [] ``` diff --git a/snippets/elementIsVisibleInViewport.md b/snippets/elementIsVisibleInViewport.md index 83e6afe71..ed2933efe 100644 --- a/snippets/elementIsVisibleInViewport.md +++ b/snippets/elementIsVisibleInViewport.md @@ -20,6 +20,6 @@ const elementIsVisibleInViewport = (el, partiallyVisible = false) => { ```js // e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10} -elementIsVisibleInViewport(el) -> false // (not fully visible) -elementIsVisibleInViewport(el, true) -> true // (partially visible) +elementIsVisibleInViewport(el) // false // (not fully visible) +elementIsVisibleInViewport(el, true) // true // (partially visible) ``` diff --git a/snippets/escapeRegExp.md b/snippets/escapeRegExp.md index 7fdbff462..f82850d2b 100644 --- a/snippets/escapeRegExp.md +++ b/snippets/escapeRegExp.md @@ -9,5 +9,5 @@ const escapeRegExp = str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); ``` ```js -escapeRegExp('(test)') -> \\(test\\) +escapeRegExp('(test)') // \\(test\\) ``` diff --git a/snippets/everyNth.md b/snippets/everyNth.md index 6aa78ac69..2fab65d47 100644 --- a/snippets/everyNth.md +++ b/snippets/everyNth.md @@ -9,5 +9,5 @@ const everyNth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1); ``` ```js -everyNth([1,2,3,4,5,6], 2) -> [ 2, 4, 6 ] +everyNth([1,2,3,4,5,6], 2) // [ 2, 4, 6 ] ``` diff --git a/snippets/extendHex.md b/snippets/extendHex.md index 9338fb139..40253a7f1 100644 --- a/snippets/extendHex.md +++ b/snippets/extendHex.md @@ -10,6 +10,6 @@ const extendHex = shortHex => ``` ```js -extendHex('#03f') -> '#0033ff' -extendHex('05a') -> '#0055aa' +extendHex('#03f') // '#0033ff' +extendHex('05a') // '#0055aa' ``` diff --git a/snippets/factorial.md b/snippets/factorial.md index f4f4ad941..f1fa9bd29 100644 --- a/snippets/factorial.md +++ b/snippets/factorial.md @@ -14,5 +14,5 @@ const factorial = n => ``` ```js -factorial(6) -> 720 +factorial(6) // 720 ``` diff --git a/snippets/fibonacci.md b/snippets/fibonacci.md index 9addac34a..474bba30d 100644 --- a/snippets/fibonacci.md +++ b/snippets/fibonacci.md @@ -11,5 +11,5 @@ const fibonacci = n => ``` ```js -factorial(6) -> 720 +factorial(6) // 720 ``` diff --git a/snippets/fibonacciCountUntilNum.md b/snippets/fibonacciCountUntilNum.md index 82f53ea98..719e8cef3 100644 --- a/snippets/fibonacciCountUntilNum.md +++ b/snippets/fibonacciCountUntilNum.md @@ -10,5 +10,5 @@ const fibonacciCountUntilNum = num => ``` ```js -fibonacciCountUntilNum(10) -> 7 +fibonacciCountUntilNum(10) // 7 ``` diff --git a/snippets/fibonacciUntilNum.md b/snippets/fibonacciUntilNum.md index c7ad1cd6e..bae5456b9 100644 --- a/snippets/fibonacciUntilNum.md +++ b/snippets/fibonacciUntilNum.md @@ -14,5 +14,5 @@ const fibonacciUntilNum = num => { ``` ```js -fibonacciCountUntilNum(10) -> 7 +fibonacciCountUntilNum(10) // 7 ``` diff --git a/snippets/filterNonUnique.md b/snippets/filterNonUnique.md index 1568afbf8..cfce97f56 100644 --- a/snippets/filterNonUnique.md +++ b/snippets/filterNonUnique.md @@ -9,5 +9,5 @@ const filterNonUnique = arr => arr.filter(i => arr.indexOf(i) === arr.lastIndexO ``` ```js -filterNonUnique([1,2,2,3,4,4,5]) -> [1,3,5] +filterNonUnique([1,2,2,3,4,4,5]) // [1,3,5] ``` diff --git a/snippets/flatten.md b/snippets/flatten.md index 66b5b86ad..29cb52ad1 100644 --- a/snippets/flatten.md +++ b/snippets/flatten.md @@ -9,5 +9,5 @@ const flatten = arr => [ ].concat( ...arr ); ``` ```js -flatten([1,[2],3,4]) -> [1,2,3,4] +flatten([1,[2],3,4]) // [1,2,3,4] ``` diff --git a/snippets/flattenDepth.md b/snippets/flattenDepth.md index 6034b9135..a08563ca5 100644 --- a/snippets/flattenDepth.md +++ b/snippets/flattenDepth.md @@ -14,5 +14,5 @@ const flattenDepth = (arr, depth = 1) => ``` ```js -flatten([1,[2],3,4]) -> [1,2,3,4] +flatten([1,[2],3,4]) // [1,2,3,4] ``` diff --git a/snippets/fromCamelCase.md b/snippets/fromCamelCase.md index 14c21bc4c..9a74226f7 100644 --- a/snippets/fromCamelCase.md +++ b/snippets/fromCamelCase.md @@ -12,7 +12,7 @@ const fromCamelCase = (str, separator = '_') => ``` ```js -fromCamelCase('someDatabaseFieldName', ' ') -> 'some database field name' -fromCamelCase('someLabelThatNeedsToBeCamelized', '-') -> 'some-label-that-needs-to-be-camelized' -fromCamelCase('someJavascriptProperty', '_') -> 'some_javascript_property' +fromCamelCase('someDatabaseFieldName', ' ') // 'some database field name' +fromCamelCase('someLabelThatNeedsToBeCamelized', '-') // 'some-label-that-needs-to-be-camelized' +fromCamelCase('someJavascriptProperty', '_') // 'some_javascript_property' ``` diff --git a/snippets/functionName.md b/snippets/functionName.md index 1ad25772a..17869a6a6 100644 --- a/snippets/functionName.md +++ b/snippets/functionName.md @@ -9,5 +9,5 @@ const functionName = fn => (console.debug(fn.name), fn); ``` ```js -functionName(Math.max) -> max (logged in debug channel of console) +functionName(Math.max) // max (logged in debug channel of console) ``` diff --git a/snippets/gcd.md b/snippets/gcd.md index 8affada12..f3faa5057 100644 --- a/snippets/gcd.md +++ b/snippets/gcd.md @@ -11,5 +11,5 @@ const gcd = (x, y) => !y ? x : gcd(y, x % y); ``` ```js -gcd (8, 36) -> 4 +gcd (8, 36) // 4 ``` diff --git a/snippets/getDaysDiffBetweenDates.md b/snippets/getDaysDiffBetweenDates.md index 6c73366ac..f0f4d5763 100644 --- a/snippets/getDaysDiffBetweenDates.md +++ b/snippets/getDaysDiffBetweenDates.md @@ -9,5 +9,5 @@ const getDaysDiffBetweenDates = (dateInitial, dateFinal) => (dateFinal - dateIni ``` ```js -getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) -> 9 +getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) // 9 ``` diff --git a/snippets/getScrollPosition.md b/snippets/getScrollPosition.md index 2708210a1..4860b0293 100644 --- a/snippets/getScrollPosition.md +++ b/snippets/getScrollPosition.md @@ -12,5 +12,5 @@ const getScrollPosition = (el = window) => ``` ```js -getScrollPosition() -> {x: 0, y: 200} +getScrollPosition() // {x: 0, y: 200} ``` diff --git a/snippets/getType.md b/snippets/getType.md index f0b9be8d5..655f62adb 100644 --- a/snippets/getType.md +++ b/snippets/getType.md @@ -10,5 +10,5 @@ const getType = v => ``` ```js -getType(new Set([1,2,3])) -> "set" +getType(new Set([1,2,3])) // "set" ``` diff --git a/snippets/getURLParameters.md b/snippets/getURLParameters.md index 5f4690bfc..b1e138450 100644 --- a/snippets/getURLParameters.md +++ b/snippets/getURLParameters.md @@ -13,5 +13,5 @@ const getURLParameters = url => ``` ```js -getURLParameters('http://url.com/page?name=Adam&surname=Smith') -> {name: 'Adam', surname: 'Smith'} +getURLParameters('http://url.com/page?name=Adam&surname=Smith') // {name: 'Adam', surname: 'Smith'} ``` diff --git a/snippets/groupBy.md b/snippets/groupBy.md index 4b301e2b8..bebea215c 100644 --- a/snippets/groupBy.md +++ b/snippets/groupBy.md @@ -12,6 +12,6 @@ const groupBy = (arr, func) => ``` ```js -groupBy([6.1, 4.2, 6.3], Math.floor) -> {4: [4.2], 6: [6.1, 6.3]} -groupBy(['one', 'two', 'three'], 'length') -> {3: ['one', 'two'], 5: ['three']} +groupBy([6.1, 4.2, 6.3], Math.floor) // {4: [4.2], 6: [6.1, 6.3]} +groupBy(['one', 'two', 'three'], 'length') // {3: ['one', 'two'], 5: ['three']} ``` diff --git a/snippets/hammingDistance.md b/snippets/hammingDistance.md index e0f22dba7..aedc72ce8 100644 --- a/snippets/hammingDistance.md +++ b/snippets/hammingDistance.md @@ -11,5 +11,5 @@ const hammingDistance = (num1, num2) => ``` ```js -hammingDistance(2,3) -> 1 +hammingDistance(2,3) // 1 ``` diff --git a/snippets/head.md b/snippets/head.md index 30b8951a6..b48d9bb1d 100644 --- a/snippets/head.md +++ b/snippets/head.md @@ -9,5 +9,5 @@ const head = arr => arr[0]; ``` ```js -head([1,2,3]) -> 1 +head([1,2,3]) // 1 ``` diff --git a/snippets/hexToRGB.md b/snippets/hexToRGB.md index d3fab8a8d..c24323286 100644 --- a/snippets/hexToRGB.md +++ b/snippets/hexToRGB.md @@ -19,7 +19,7 @@ const hexToRGB = hex => { ``` ```js -hexToRGB('#27ae60ff') -> 'rgba(39, 174, 96, 255)' -hexToRGB('27ae60') -> 'rgb(39, 174, 96)' -hexToRGB('#fff') -> 'rgb(255, 255, 255)' +hexToRGB('#27ae60ff') // 'rgba(39, 174, 96, 255)' +hexToRGB('27ae60') // 'rgb(39, 174, 96)' +hexToRGB('#fff') // 'rgb(255, 255, 255)' ``` diff --git a/snippets/inRange.md b/snippets/inRange.md index f4caf811c..044b32a0c 100644 --- a/snippets/inRange.md +++ b/snippets/inRange.md @@ -13,8 +13,8 @@ const inRange = (n, start, end=null) => { ``` ```js -inRange(3, 2, 5) -> true -inRange(3, 4) -> true -inRange(2, 3, 5) -> false -inrange(3, 2) -> false +inRange(3, 2, 5) // true +inRange(3, 4) // true +inRange(2, 3, 5) // false +inrange(3, 2) // false ``` diff --git a/snippets/initial.md b/snippets/initial.md index 87827c437..be178bcc8 100644 --- a/snippets/initial.md +++ b/snippets/initial.md @@ -9,5 +9,5 @@ const initial = arr => arr.slice(0, -1); ``` ```js -initial([1,2,3]) -> [1,2] +initial([1,2,3]) // [1,2] ``` diff --git a/snippets/initialize2DArray.md b/snippets/initialize2DArray.md index add743115..bde4ba879 100644 --- a/snippets/initialize2DArray.md +++ b/snippets/initialize2DArray.md @@ -9,5 +9,5 @@ const initialize2DArray = (w, h, val = null) => Array(h).fill().map(() => Array( ``` ```js -initialize2DArray(2, 2, 0) -> [[0,0], [0,0]] +initialize2DArray(2, 2, 0) // [[0,0], [0,0]] ``` diff --git a/snippets/initializeArrayWithRange.md b/snippets/initializeArrayWithRange.md index 8ea87a9c4..9c3b0c8f4 100644 --- a/snippets/initializeArrayWithRange.md +++ b/snippets/initializeArrayWithRange.md @@ -11,6 +11,6 @@ const initializeArrayWithRange = (end, start = 0) => ``` ```js -initializeArrayWithRange(5) -> [0,1,2,3,4,5] -initializeArrayWithRange(7, 3) -> [3,4,5,6,7] +initializeArrayWithRange(5) // [0,1,2,3,4,5] +initializeArrayWithRange(7, 3) // [3,4,5,6,7] ``` diff --git a/snippets/initializeArrayWithValues.md b/snippets/initializeArrayWithValues.md index a92a09e7a..a8ac57bc5 100644 --- a/snippets/initializeArrayWithValues.md +++ b/snippets/initializeArrayWithValues.md @@ -10,5 +10,5 @@ const initializeArrayWithValues = (n, value = 0) => Array(n).fill(value); ``` ```js -initializeArrayWithValues(5, 2) -> [2,2,2,2,2] +initializeArrayWithValues(5, 2) // [2,2,2,2,2] ``` diff --git a/snippets/intersection.md b/snippets/intersection.md index 0596a04ce..960433b6e 100644 --- a/snippets/intersection.md +++ b/snippets/intersection.md @@ -9,5 +9,5 @@ const intersection = (a, b) => { const s = new Set(b); return a.filter(x => s.ha ``` ```js -intersection([1,2,3], [4,3,2]) -> [2,3] +intersection([1,2,3], [4,3,2]) // [2,3] ``` diff --git a/snippets/isArmstrongNumber.md b/snippets/isArmstrongNumber.md index 65972fc88..81f59409e 100644 --- a/snippets/isArmstrongNumber.md +++ b/snippets/isArmstrongNumber.md @@ -10,7 +10,7 @@ const isArmstrongNumber = digits => ``` ```js -isArmstrongNumber(1634) -> true -isArmstrongNumber(371) -> true -isArmstrongNumber(56) -> false +isArmstrongNumber(1634) // true +isArmstrongNumber(371) // true +isArmstrongNumber(56) // false ``` diff --git a/snippets/isArray.md b/snippets/isArray.md index 28b80c262..3fa987f4f 100644 --- a/snippets/isArray.md +++ b/snippets/isArray.md @@ -9,6 +9,6 @@ const isArray = val => !!val && Array.isArray(val); ``` ```js -isArray(null) -> false -isArray([1]) -> true +isArray(null) // false +isArray([1]) // true ``` diff --git a/snippets/isBoolean.md b/snippets/isBoolean.md index ad47fa33e..3e7022df9 100644 --- a/snippets/isBoolean.md +++ b/snippets/isBoolean.md @@ -9,6 +9,6 @@ const isBoolean = val => typeof val === 'boolean'; ``` ```js -isBoolean(null) -> false -isBoolean(false) -> true +isBoolean(null) // false +isBoolean(false) // true ``` diff --git a/snippets/isDivisible.md b/snippets/isDivisible.md index 95919d69d..b7a5614f0 100644 --- a/snippets/isDivisible.md +++ b/snippets/isDivisible.md @@ -9,5 +9,5 @@ const isDivisible = (dividend, divisor) => dividend % divisor === 0; ``` ```js -isDivisible(6,3) -> true +isDivisible(6,3) // true ``` diff --git a/snippets/isEven.md b/snippets/isEven.md index b2bb58b58..2e3312309 100644 --- a/snippets/isEven.md +++ b/snippets/isEven.md @@ -10,5 +10,5 @@ const isEven = num => num % 2 === 0; ``` ```js -isEven(3) -> false +isEven(3) // false ``` diff --git a/snippets/isFunction.md b/snippets/isFunction.md index eae2073e4..d1c0a722d 100644 --- a/snippets/isFunction.md +++ b/snippets/isFunction.md @@ -9,6 +9,6 @@ const isFunction = val => val && typeof val === 'function'; ``` ```js -isFunction('x') -> false -isFunction(x => x) -> true +isFunction('x') // false +isFunction(x => x) // true ``` diff --git a/snippets/isNumber.md b/snippets/isNumber.md index 3035a0a3a..f14a608e5 100644 --- a/snippets/isNumber.md +++ b/snippets/isNumber.md @@ -9,6 +9,6 @@ const isNumber = val => typeof val === 'number'; ``` ```js -isNumber('1') -> false -isNumber(1) -> true +isNumber('1') // false +isNumber(1) // true ``` \ No newline at end of file diff --git a/snippets/isPrime.md b/snippets/isPrime.md index 2e609028b..b0d23c80e 100644 --- a/snippets/isPrime.md +++ b/snippets/isPrime.md @@ -14,6 +14,6 @@ const isPrime = num => { ``` ```js -isPrime(11) -> true -isPrime(12) -> false +isPrime(11) // true +isPrime(12) // false ``` diff --git a/snippets/isString.md b/snippets/isString.md index 923bcd174..1e0dbcef6 100644 --- a/snippets/isString.md +++ b/snippets/isString.md @@ -9,6 +9,6 @@ const isString = val => typeof val === 'string'; ``` ```js -isString(10) -> false -isString('10') -> true +isString(10) // false +isString('10') // true ``` diff --git a/snippets/isSymbol.md b/snippets/isSymbol.md index 0baa68500..a0ae667eb 100644 --- a/snippets/isSymbol.md +++ b/snippets/isSymbol.md @@ -9,6 +9,6 @@ const isSymbol = val => typeof val === 'symbol'; ``` ```js -isSymbol('x') -> false -isSymbol(Symbol('x')) -> true +isSymbol('x') // false +isSymbol(Symbol('x')) // true ``` diff --git a/snippets/last.md b/snippets/last.md index f26427591..3dd1cf680 100644 --- a/snippets/last.md +++ b/snippets/last.md @@ -9,5 +9,5 @@ const last = arr => arr[arr.length - 1]; ``` ```js -last([1,2,3]) -> 3 +last([1,2,3]) // 3 ``` diff --git a/snippets/lcm.md b/snippets/lcm.md index cc9b32367..ec98e26b7 100644 --- a/snippets/lcm.md +++ b/snippets/lcm.md @@ -13,5 +13,5 @@ const lcm = (x,y) => { ``` ```js -lcm(12,7) -> 84 +lcm(12,7) // 84 ``` diff --git a/snippets/median.md b/snippets/median.md index e472e7c0d..77ec63fdf 100644 --- a/snippets/median.md +++ b/snippets/median.md @@ -13,6 +13,6 @@ const median = arr => { ``` ```js -median([5,6,50,1,-5]) -> 5 -median([0,10,-2,7]) -> 3.5 +median([5,6,50,1,-5]) // 5 +median([0,10,-2,7]) // 3.5 ``` diff --git a/snippets/negate.md b/snippets/negate.md index 739ad97c1..fd8856b2f 100644 --- a/snippets/negate.md +++ b/snippets/negate.md @@ -9,6 +9,6 @@ const negate = func => (...args) => !func(...args); ``` ```js -filter([1, 2, 3, 4, 5, 6], negate(isEven)) -> [1, 3, 5] -negate(isOdd)(1) -> false +filter([1, 2, 3, 4, 5, 6], negate(isEven)) // [1, 3, 5] +negate(isOdd)(1) // false ``` diff --git a/snippets/nthElement.md b/snippets/nthElement.md index ba2d1933e..9c1fbf387 100644 --- a/snippets/nthElement.md +++ b/snippets/nthElement.md @@ -11,6 +11,6 @@ const nthElement = (arr, n=0) => (n>0? arr.slice(n,n+1) : arr.slice(n))[0]; ``` ```js -nthElement(['a','b','c'],1) -> 'b' -nthElement(['a','b','b'],-3) -> 'a' +nthElement(['a','b','c'],1) // 'b' +nthElement(['a','b','b'],-3) // 'a' ``` diff --git a/snippets/objectFromPairs.md b/snippets/objectFromPairs.md index 2ed208f44..5066ff528 100644 --- a/snippets/objectFromPairs.md +++ b/snippets/objectFromPairs.md @@ -9,5 +9,5 @@ const objectFromPairs = arr => arr.reduce((a, v) => (a[v[0]] = v[1], a), {}); ``` ```js -objectFromPairs([['a',1],['b',2]]) -> {a: 1, b: 2} +objectFromPairs([['a',1],['b',2]]) // {a: 1, b: 2} ``` diff --git a/snippets/objectToPairs.md b/snippets/objectToPairs.md index 6ea5fc051..6d73bc93b 100644 --- a/snippets/objectToPairs.md +++ b/snippets/objectToPairs.md @@ -9,5 +9,5 @@ const objectToPairs = obj => Object.keys(obj).map(k => [k, obj[k]]); ``` ```js -objectToPairs({a: 1, b: 2}) -> [['a',1],['b',2]]) +objectToPairs({a: 1, b: 2}) // [['a',1],['b',2]]) ``` diff --git a/snippets/orderBy.md b/snippets/orderBy.md index ab5581dc3..48c1d1172 100644 --- a/snippets/orderBy.md +++ b/snippets/orderBy.md @@ -21,6 +21,6 @@ const orderBy = (arr, props, orders) => ```js const users = [{ 'name': 'fred', 'age': 48 },{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 },{ 'name': 'barney', 'age': 34 }]; -orderby(users, ['name', 'age'], ['asc', 'desc']) -> [{name: 'barney', age: 36}, {name: 'barney', age: 34}, {name: 'fred', age: 48}, {name: 'fred', age: 40}] -orderby(users, ['name', 'age']) -> [{name: 'barney', age: 34}, {name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}] +orderby(users, ['name', 'age'], ['asc', 'desc']) // [{name: 'barney', age: 36}, {name: 'barney', age: 34}, {name: 'fred', age: 48}, {name: 'fred', age: 40}] +orderby(users, ['name', 'age']) // [{name: 'barney', age: 34}, {name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}] ``` diff --git a/snippets/palindrome.md b/snippets/palindrome.md index 820162617..f6c8f4204 100644 --- a/snippets/palindrome.md +++ b/snippets/palindrome.md @@ -13,5 +13,5 @@ const palindrome = str => { ``` ```js -palindrome('taco cat') -> true +palindrome('taco cat') // true ``` diff --git a/snippets/percentile.md b/snippets/percentile.md index 5287521b0..92a9d2eab 100644 --- a/snippets/percentile.md +++ b/snippets/percentile.md @@ -10,5 +10,5 @@ const percentile = (arr, val) => ``` ```js -percentile([1,2,3,4,5,6,7,8,9,10], 6) -> 55 +percentile([1,2,3,4,5,6,7,8,9,10], 6) // 55 ``` diff --git a/snippets/pick.md b/snippets/pick.md index 0bfeba286..f59ff2ba6 100644 --- a/snippets/pick.md +++ b/snippets/pick.md @@ -10,5 +10,5 @@ const pick = (obj, arr) => ``` ```js -pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) -> { 'a': 1, 'c': 3 } +pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) // { 'a': 1, 'c': 3 } ``` diff --git a/snippets/pipe.md b/snippets/pipe.md index a7c271afe..58b606c4c 100644 --- a/snippets/pipe.md +++ b/snippets/pipe.md @@ -13,5 +13,5 @@ const pipeFunctions = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args) const add5 = x => x + 5 const multiply = (x, y) => x * y const multiplyAndAdd5 = pipeFunctions(multiply, add5) -multiplyAndAdd5(5, 2) -> 15 +multiplyAndAdd5(5, 2) // 15 ``` diff --git a/snippets/powerset.md b/snippets/powerset.md index dc91406e9..3e1651174 100644 --- a/snippets/powerset.md +++ b/snippets/powerset.md @@ -10,5 +10,5 @@ const powerset = arr => ``` ```js -powerset([1,2]) -> [[], [1], [2], [2,1]] +powerset([1,2]) // [[], [1], [2], [2,1]] ``` diff --git a/snippets/primes.md b/snippets/primes.md index c8b64f1e5..87ac21a70 100644 --- a/snippets/primes.md +++ b/snippets/primes.md @@ -15,5 +15,5 @@ const primes = num => { ``` ```js -primes(10) -> [2,3,5,7] +primes(10) // [2,3,5,7] ``` diff --git a/snippets/promisify.md b/snippets/promisify.md index 4769fa5e9..f4a414cc1 100644 --- a/snippets/promisify.md +++ b/snippets/promisify.md @@ -18,5 +18,5 @@ const promisify = func => ```js const delay = promisify((d, cb) => setTimeout(cb, d)) -delay(2000).then(() => console.log('Hi!')) -> // Promise resolves after 2s +delay(2000).then(() => console.log('Hi!')) // // Promise resolves after 2s ``` diff --git a/snippets/pull.md b/snippets/pull.md index 52e0f3ea6..153732ffd 100644 --- a/snippets/pull.md +++ b/snippets/pull.md @@ -19,9 +19,9 @@ const pull = (arr, ...args) => { ```js let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c']; pull(myArray1, 'a', 'c'); -console.log(myArray1) -> [ 'b', 'b' ] +console.log(myArray1) // [ 'b', 'b' ] let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c']; pull(myArray2, ['a', 'c']); -console.log(myArray2) -> [ 'b', 'b' ] +console.log(myArray2) // [ 'b', 'b' ] ``` diff --git a/snippets/pullAtIndex.md b/snippets/pullAtIndex.md index bd7472567..459c2c7b2 100644 --- a/snippets/pullAtIndex.md +++ b/snippets/pullAtIndex.md @@ -21,6 +21,6 @@ const pullAtIndex = (arr, pullArr) => { let myArray = ['a', 'b', 'c', 'd']; let pulled = pullAtIndex(myArray, [1, 3]); -console.log(myArray); -> [ 'a', 'c' ] -console.log(pulled); -> [ 'b', 'd' ] +console.log(myArray); // [ 'a', 'c' ] +console.log(pulled); // [ 'b', 'd' ] ``` diff --git a/snippets/pullAtValue.md b/snippets/pullAtValue.md index 97a59a0ed..ff2559a53 100644 --- a/snippets/pullAtValue.md +++ b/snippets/pullAtValue.md @@ -20,6 +20,6 @@ const pullAtValue = (arr, pullArr) => { ```js let myArray = ['a', 'b', 'c', 'd']; let pulled = pullAtValue(myArray, ['b', 'd']); -console.log(myArray); -> [ 'a', 'c' ] -console.log(pulled); -> [ 'b', 'd' ] +console.log(myArray); // [ 'a', 'c' ] +console.log(pulled); // [ 'b', 'd' ] ``` diff --git a/snippets/randomHexColorCode.md b/snippets/randomHexColorCode.md index a40f129e2..5009e1977 100644 --- a/snippets/randomHexColorCode.md +++ b/snippets/randomHexColorCode.md @@ -9,7 +9,7 @@ const randomHexColorCode = () => '#'+(Math.random()*0xFFFFFF<<0).toString(16); ``` ```js -randomHexColorCode() -> "#e34155" -randomHexColorCode() -> "#fd73a6" -randomHexColorCode() -> "#4144c6" +randomHexColorCode() // "#e34155" +randomHexColorCode() // "#fd73a6" +randomHexColorCode() // "#4144c6" ``` diff --git a/snippets/randomIntegerInRange.md b/snippets/randomIntegerInRange.md index e8fd26077..95e9383aa 100644 --- a/snippets/randomIntegerInRange.md +++ b/snippets/randomIntegerInRange.md @@ -9,5 +9,5 @@ const randomIntegerInRange = (min, max) => Math.floor(Math.random() * (max - min ``` ```js -randomIntegerInRange(0, 5) -> 2 +randomIntegerInRange(0, 5) // 2 ``` diff --git a/snippets/randomNumberInRange.md b/snippets/randomNumberInRange.md index 53d60b16d..b249c0e51 100644 --- a/snippets/randomNumberInRange.md +++ b/snippets/randomNumberInRange.md @@ -9,5 +9,5 @@ const randomNumberInRange = (min, max) => Math.random() * (max - min) + min; ``` ```js -randomNumberInRange(2,10) -> 6.0211363285087005 +randomNumberInRange(2,10) // 6.0211363285087005 ``` diff --git a/snippets/readFileLines.md b/snippets/readFileLines.md index 1939a78cd..66afab87f 100644 --- a/snippets/readFileLines.md +++ b/snippets/readFileLines.md @@ -18,5 +18,5 @@ contents of test.txt : line3 ___________________________ let arr = readFileLines('test.txt') -console.log(arr) // -> ['line1', 'line2', 'line3'] +console.log(arr) // // ['line1', 'line2', 'line3'] ``` diff --git a/snippets/remove.md b/snippets/remove.md index 78be3257b..8d41ac5b7 100644 --- a/snippets/remove.md +++ b/snippets/remove.md @@ -14,5 +14,5 @@ const remove = (arr, func) => ``` ```js -remove([1, 2, 3, 4], n => n % 2 == 0) -> [2, 4] +remove([1, 2, 3, 4], n => n % 2 == 0) // [2, 4] ``` diff --git a/snippets/repeatString.md b/snippets/repeatString.md index 2d892b506..2f66bb047 100644 --- a/snippets/repeatString.md +++ b/snippets/repeatString.md @@ -11,6 +11,6 @@ const repeatString = (str="",num=2) => { ``` ```js -repeatString("abc",3) -> 'abcabcabc' -repeatString("abc") -> 'abcabc' +repeatString("abc",3) // 'abcabcabc' +repeatString("abc") // 'abcabc' ``` diff --git a/snippets/reverseString.md b/snippets/reverseString.md index 2fe9cdd0b..d34aac630 100644 --- a/snippets/reverseString.md +++ b/snippets/reverseString.md @@ -10,5 +10,5 @@ const reverseString = str => str.split('').reverse().join(''); ``` ```js -reverseString('foobar') -> 'raboof' +reverseString('foobar') // 'raboof' ``` diff --git a/snippets/round.md b/snippets/round.md index 9c6b55f2c..8ece6dcd1 100644 --- a/snippets/round.md +++ b/snippets/round.md @@ -10,5 +10,5 @@ const round = (n, decimals=0) => Number(`${Math.round(`${n}e${decimals}`)}e-${de ``` ```js -round(1.005, 2) -> 1.01 +round(1.005, 2) // 1.01 ``` diff --git a/snippets/runPromisesInSeries.md b/snippets/runPromisesInSeries.md index 9719ed6aa..d45b00d07 100644 --- a/snippets/runPromisesInSeries.md +++ b/snippets/runPromisesInSeries.md @@ -10,5 +10,5 @@ const runPromisesInSeries = ps => ps.reduce((p, next) => p.then(next), Promise.r ```js const delay = (d) => new Promise(r => setTimeout(r, d)) -runPromisesInSeries([() => delay(1000), () => delay(2000)]) -> //executes each promise sequentially, taking a total of 3 seconds to complete +runPromisesInSeries([() => delay(1000), () => delay(2000)]) // //executes each promise sequentially, taking a total of 3 seconds to complete ``` diff --git a/snippets/sample.md b/snippets/sample.md index 078542224..8a5dc3292 100644 --- a/snippets/sample.md +++ b/snippets/sample.md @@ -10,5 +10,5 @@ const sample = arr => arr[Math.floor(Math.random() * arr.length)]; ``` ```js -sample([3, 7, 9, 11]) -> 9 +sample([3, 7, 9, 11]) // 9 ``` diff --git a/snippets/select.md b/snippets/select.md index c3db1e047..1c6ff462f 100644 --- a/snippets/select.md +++ b/snippets/select.md @@ -11,5 +11,5 @@ const select = (from, selector) => ```js const obj = {selector: {to: {val: 'val to select'}}}; -select(obj, 'selector.to.val'); -> 'val to select' +select(obj, 'selector.to.val'); // 'val to select' ``` diff --git a/snippets/shallowClone.md b/snippets/shallowClone.md index cdef28d9b..2eed68a58 100644 --- a/snippets/shallowClone.md +++ b/snippets/shallowClone.md @@ -11,5 +11,5 @@ const shallowClone = obj => Object.assign({}, obj); ```js const a = { x: true, y: 1 }; const b = shallowClone(a); -a === b -> false +a === b // false ``` diff --git a/snippets/shuffle.md b/snippets/shuffle.md index 00b434d77..593167984 100644 --- a/snippets/shuffle.md +++ b/snippets/shuffle.md @@ -9,5 +9,5 @@ const shuffle = arr => arr.sort(() => Math.random() - 0.5); ``` ```js -shuffle([1,2,3]) -> [2,3,1] +shuffle([1,2,3]) // [2,3,1] ``` diff --git a/snippets/similarity.md b/snippets/similarity.md index e1f735be2..6a3c89b38 100644 --- a/snippets/similarity.md +++ b/snippets/similarity.md @@ -9,5 +9,5 @@ const similarity = (arr, values) => arr.filter(v => values.includes(v)); ``` ```js -similarity([1,2,3], [1,2,4]) -> [1,2] +similarity([1,2,3], [1,2,4]) // [1,2] ``` diff --git a/snippets/sortCharactersInString.md b/snippets/sortCharactersInString.md index 4e7e68cf7..8bdc6bcce 100644 --- a/snippets/sortCharactersInString.md +++ b/snippets/sortCharactersInString.md @@ -10,5 +10,5 @@ const sortCharactersInString = str => ``` ```js -sortCharactersInString('cabbage') -> 'aabbceg' +sortCharactersInString('cabbage') // 'aabbceg' ``` diff --git a/snippets/speechSynthesis.md b/snippets/speechSynthesis.md index 2ccb55375..74a628795 100644 --- a/snippets/speechSynthesis.md +++ b/snippets/speechSynthesis.md @@ -16,5 +16,5 @@ const speechSynthesis = message => { ``` ```js -speechSynthesis('Hello, World') -> // plays the message +speechSynthesis('Hello, World') // // plays the message ``` diff --git a/snippets/spreadOver.md b/snippets/spreadOver.md index d41b1cb36..3c26506c1 100644 --- a/snippets/spreadOver.md +++ b/snippets/spreadOver.md @@ -10,6 +10,6 @@ const spreadOver = fn => argsArr => fn(...argsArr); ```js const arrayMax = spreadOver(Math.max) -arrayMax([1,2,3]) -> 3 -arrayMax([1,2,4]) -> 4 +arrayMax([1,2,3]) // 3 +arrayMax([1,2,4]) // 4 ``` diff --git a/snippets/standardDeviation.md b/snippets/standardDeviation.md index 43d7139fd..0bddc99e8 100644 --- a/snippets/standardDeviation.md +++ b/snippets/standardDeviation.md @@ -17,6 +17,6 @@ const standardDeviation = (arr, usePopulation = false) => { ``` ```js -standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample) -standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population) +standardDeviation([10,2,38,23,38,23,21]) // 13.284434142114991 (sample) +standardDeviation([10,2,38,23,38,23,21], true) // 12.29899614287479 (population) ``` diff --git a/snippets/symmetricDifference.md b/snippets/symmetricDifference.md index 6879edb39..a26a4db4a 100644 --- a/snippets/symmetricDifference.md +++ b/snippets/symmetricDifference.md @@ -12,5 +12,5 @@ const symmetricDifference = (a, b) => { ``` ```js -symmetricDifference([1,2,3], [1,2,4]) -> [3,4] +symmetricDifference([1,2,3], [1,2,4]) // [3,4] ``` diff --git a/snippets/tail.md b/snippets/tail.md index 69983d169..cc7fb6130 100644 --- a/snippets/tail.md +++ b/snippets/tail.md @@ -9,6 +9,6 @@ const tail = arr => arr.length > 1 ? arr.slice(1) : arr; ``` ```js -tail([1,2,3]) -> [2,3] -tail([1]) -> [1] +tail([1,2,3]) // [2,3] +tail([1]) // [1] ``` diff --git a/snippets/take.md b/snippets/take.md index 07d25262d..d8257f54f 100644 --- a/snippets/take.md +++ b/snippets/take.md @@ -9,6 +9,6 @@ const take = (arr, n = 1) => arr.slice(0, n); ``` ```js -take([1, 2, 3], 5) -> [1, 2, 3] -take([1, 2, 3], 0) -> [] +take([1, 2, 3], 5) // [1, 2, 3] +take([1, 2, 3], 0) // [] ``` diff --git a/snippets/takeRight.md b/snippets/takeRight.md index 45d272ed0..13b8d47ed 100644 --- a/snippets/takeRight.md +++ b/snippets/takeRight.md @@ -9,6 +9,6 @@ const takeRight = (arr, n = 1) => arr.slice(arr.length - n, arr.length); ``` ```js -takeRight([1, 2, 3], 2) -> [ 2, 3 ] -takeRight([1, 2, 3]) -> [3] +takeRight([1, 2, 3], 2) // [ 2, 3 ] +takeRight([1, 2, 3]) // [3] ``` diff --git a/snippets/timeTaken.md b/snippets/timeTaken.md index b687edecf..15941c6b0 100644 --- a/snippets/timeTaken.md +++ b/snippets/timeTaken.md @@ -12,6 +12,6 @@ const timeTaken = callback => { ``` ```js -timeTaken(() => Math.pow(2, 10)) -> 1024 +timeTaken(() => Math.pow(2, 10)) // 1024 (logged): timeTaken: 0.02099609375ms ``` diff --git a/snippets/toCamelCase.md b/snippets/toCamelCase.md index 3b0621050..130c1c4d5 100644 --- a/snippets/toCamelCase.md +++ b/snippets/toCamelCase.md @@ -15,8 +15,8 @@ const toCamelCase = str => { ``` ```js -toCamelCase("some_database_field_name") -> 'someDatabaseFieldName' -toCamelCase("Some label that needs to be camelized") -> 'someLabelThatNeedsToBeCamelized' -toCamelCase("some-javascript-property") -> 'someJavascriptProperty' -toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") -> 'someMixedStringWithSpacesUnderscoresAndHyphens' +toCamelCase("some_database_field_name") // 'someDatabaseFieldName' +toCamelCase("Some label that needs to be camelized") // 'someLabelThatNeedsToBeCamelized' +toCamelCase("some-javascript-property") // 'someJavascriptProperty' +toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") // 'someMixedStringWithSpacesUnderscoresAndHyphens' ``` diff --git a/snippets/toDecimalMark.md b/snippets/toDecimalMark.md index 4a2716c0a..b670622cd 100644 --- a/snippets/toDecimalMark.md +++ b/snippets/toDecimalMark.md @@ -7,5 +7,5 @@ const toDecimalMark = num => num.toLocaleString("en-US"); ``` ```js -toDecimalMark(12305030388.9087) -> "12,305,030,388.9087" +toDecimalMark(12305030388.9087) // "12,305,030,388.9087" ``` diff --git a/snippets/toEnglishDate.md b/snippets/toEnglishDate.md index 1d600c808..974bdcc02 100644 --- a/snippets/toEnglishDate.md +++ b/snippets/toEnglishDate.md @@ -11,5 +11,5 @@ const toEnglishDate = (time) => ``` ```js -toEnglishDate('09/21/2010') -> '21/09/2010' +toEnglishDate('09/21/2010') // '21/09/2010' ``` diff --git a/snippets/toKebabCase.md b/snippets/toKebabCase.md index 50b7ead16..b1782726f 100644 --- a/snippets/toKebabCase.md +++ b/snippets/toKebabCase.md @@ -13,9 +13,9 @@ const toKebabCase = str => ``` ```js -toKebabCase("camelCase") -> 'camel-case' -toKebabCase("some text") -> 'some-text' -toKebabCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some-mixed-string-with-spaces-underscores-and-hyphens' -toKebabCase("AllThe-small Things") -> "all-the-small-things" -toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-xml-and-html" +toKebabCase("camelCase") // 'camel-case' +toKebabCase("some text") // 'some-text' +toKebabCase("some-mixed_string With spaces_underscores-and-hyphens") // 'some-mixed-string-with-spaces-underscores-and-hyphens' +toKebabCase("AllThe-small Things") // "all-the-small-things" +toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') // "i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-xml-and-html" ``` diff --git a/snippets/toOrdinalSuffix.md b/snippets/toOrdinalSuffix.md index 53541c162..bf0f19227 100644 --- a/snippets/toOrdinalSuffix.md +++ b/snippets/toOrdinalSuffix.md @@ -16,5 +16,5 @@ const toOrdinalSuffix = num => { ``` ```js -toOrdinalSuffix("123") -> "123rd" +toOrdinalSuffix("123") // "123rd" ``` diff --git a/snippets/toSnakeCase.md b/snippets/toSnakeCase.md index d978e7abc..be27970a9 100644 --- a/snippets/toSnakeCase.md +++ b/snippets/toSnakeCase.md @@ -13,10 +13,10 @@ const toSnakeCase = str =>{ ``` ```js -toSnakeCase("camelCase") -> 'camel_case' -toSnakeCase("some text") -> 'some_text' -toSnakeCase("some-javascript-property") -> 'some_javascript_property' -toSnakeCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some_mixed_string_with_spaces_underscores_and_hyphens' -toSnakeCase("AllThe-small Things") -> "all_the_smal_things" -toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html" +toSnakeCase("camelCase") // 'camel_case' +toSnakeCase("some text") // 'some_text' +toSnakeCase("some-javascript-property") // 'some_javascript_property' +toSnakeCase("some-mixed_string With spaces_underscores-and-hyphens") // 'some_mixed_string_with_spaces_underscores_and_hyphens' +toSnakeCase("AllThe-small Things") // "all_the_smal_things" +toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') // "i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html" ``` diff --git a/snippets/truncateString.md b/snippets/truncateString.md index 56561cc7f..66fc5d855 100644 --- a/snippets/truncateString.md +++ b/snippets/truncateString.md @@ -11,5 +11,5 @@ const truncateString = (str, num) => ``` ```js -truncateString('boomerang', 7) -> 'boom...' +truncateString('boomerang', 7) // 'boom...' ``` diff --git a/snippets/truthCheckCollection.md b/snippets/truthCheckCollection.md index a2c4cb35e..4a8aa7e14 100644 --- a/snippets/truthCheckCollection.md +++ b/snippets/truthCheckCollection.md @@ -9,5 +9,5 @@ const truthCheckCollection = (collection, pre) => (collection.every(obj => obj[p ``` ```js -truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") -> true +truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") // true ``` diff --git a/snippets/union.md b/snippets/union.md index d141d2a3e..155fbd7c4 100644 --- a/snippets/union.md +++ b/snippets/union.md @@ -9,5 +9,5 @@ const union = (a, b) => Array.from(new Set([...a, ...b])); ``` ```js -union([1,2,3], [4,3,2]) -> [1,2,3,4] +union([1,2,3], [4,3,2]) // [1,2,3,4] ``` diff --git a/snippets/validateNumber.md b/snippets/validateNumber.md index 075e6b4f9..70840cf88 100644 --- a/snippets/validateNumber.md +++ b/snippets/validateNumber.md @@ -11,5 +11,5 @@ const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == ``` ```js -validateNumber('10') -> true +validateNumber('10') // true ``` diff --git a/snippets/without.md b/snippets/without.md index 044f2e8f6..594ea2edd 100644 --- a/snippets/without.md +++ b/snippets/without.md @@ -11,5 +11,5 @@ const without = (arr, ...args) => arr.filter(v => !args.includes(v)); ``` ```js -without([2, 1, 2, 3], 1, 2) -> [3] +without([2, 1, 2, 3], 1, 2) // [3] ``` diff --git a/snippets/words.md b/snippets/words.md index 47d70659d..3d8097da7 100644 --- a/snippets/words.md +++ b/snippets/words.md @@ -10,6 +10,6 @@ const words = (str, pattern = /[^a-zA-Z-]+/) => str.split(pattern).filter(Boolea ``` ```js -words("I love javaScript!!") -> ["I", "love", "javaScript"] -words("python, javaScript & coffee") -> ["python", "javaScript", "coffee"] +words("I love javaScript!!") // ["I", "love", "javaScript"] +words("python, javaScript & coffee") // ["python", "javaScript", "coffee"] ``` diff --git a/snippets/zip.md b/snippets/zip.md index 1d3a9080d..92613ff34 100644 --- a/snippets/zip.md +++ b/snippets/zip.md @@ -16,6 +16,6 @@ const zip = (...arrays) => { ``` ```js -zip(['a', 'b'], [1, 2], [true, false]); -> [['a', 1, true], ['b', 2, false]] -zip(['a'], [1, 2], [true, false]); -> [['a', 1, true], [undefined, 2, false]] +zip(['a', 'b'], [1, 2], [true, false]); // [['a', 1, true], ['b', 2, false]] +zip(['a'], [1, 2], [true, false]); // [['a', 1, true], [undefined, 2, false]] ``` diff --git a/snippets/zipObject.md b/snippets/zipObject.md index a9ea71146..99d134ac8 100644 --- a/snippets/zipObject.md +++ b/snippets/zipObject.md @@ -9,6 +9,6 @@ const zipObject = ( props, values ) => props.reduce( ( obj, prop, index ) => ( o ``` ```js -zipObject(['a','b','c'], [1,2]) -> {a: 1, b: 2, c: undefined} -zipObject(['a','b'], [1,2,3]) -> {a: 1, b: 2} +zipObject(['a','b','c'], [1,2]) // {a: 1, b: 2, c: undefined} +zipObject(['a','b'], [1,2,3]) // {a: 1, b: 2} ``` From aaeb11616c448ab56ee6bcb9a68748ac596c986e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 13:26:14 +0100 Subject: [PATCH 14/36] update snippet-template.md --- snippet-template.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/snippet-template.md b/snippet-template.md index f95eabc3d..c21926208 100644 --- a/snippet-template.md +++ b/snippet-template.md @@ -7,5 +7,8 @@ Explain briefly how the snippet works. ```js const functionName = arguments => {functionBody} -// functionName(sampleInput) -> sampleOutput +``` + +```js +functionName() ``` \ No newline at end of file From 5036ff578149645a9ba40a8b614e5e76550cdeb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 13:59:23 +0100 Subject: [PATCH 15/36] update snippets 1-15 --- snippets/anagrams.md | 5 ++++- snippets/arrayAverage.md | 5 ++++- snippets/arrayGcd.md | 11 +++++++---- snippets/arrayLcm.md | 13 ++++++++----- snippets/arrayMax.md | 5 ++++- snippets/arrayMin.md | 5 ++++- snippets/arraySum.md | 5 ++++- snippets/arrayToHtmlList.md | 7 +++++-- snippets/bottomVisible.md | 3 +++ snippets/call.md | 9 +++++---- snippets/capitalize.md | 7 +++++-- snippets/capitalizeEveryWord.md | 5 ++++- snippets/chainAsync.md | 5 +++-- snippets/chunk.md | 5 ++++- snippets/clampNumber.md | 13 ++++++++----- 15 files changed, 72 insertions(+), 31 deletions(-) diff --git a/snippets/anagrams.md b/snippets/anagrams.md index b89194564..2238c4a5f 100644 --- a/snippets/anagrams.md +++ b/snippets/anagrams.md @@ -13,5 +13,8 @@ const anagrams = str => { return str.split('').reduce((acc, letter, i) => acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)), []); }; -// anagrams('abc') -> ['abc','acb','bac','bca','cab','cba'] +``` + +```js +anagrams('abc') -> ['abc','acb','bac','bca','cab','cba'] ``` diff --git a/snippets/arrayAverage.md b/snippets/arrayAverage.md index 74c8cef97..92c54518b 100644 --- a/snippets/arrayAverage.md +++ b/snippets/arrayAverage.md @@ -6,5 +6,8 @@ Use `Array.reduce()` to add each value to an accumulator, initialized with a val ```js const arrayAverage = arr => arr.reduce((acc, val) => acc + val, 0) / arr.length; -// arrayAverage([1,2,3]) -> 2 +``` + +```js +arrayAverage([1,2,3]) -> 2 ``` diff --git a/snippets/arrayGcd.md b/snippets/arrayGcd.md index fde889d05..364b18792 100644 --- a/snippets/arrayGcd.md +++ b/snippets/arrayGcd.md @@ -7,8 +7,11 @@ Use `Array.reduce()` and the `gcd` formula (uses recursion) to calculate the gre ```js const arrayGcd = arr => { const gcd = (x, y) => !y ? x : gcd(y, x % y); - return arr.reduce((a, b) => gcd(a, b)); -}; -// arrayGcd([1,2,3,4,5]) -> 1 -// arrayGcd([4,8,12]) -> 4 + return arr.reduce((a,b) => gcd(a,b)); +} +``` + +```js +arrayGcd([1,2,3,4,5]) -> 1 +arrayGcd([4,8,12]) -> 4 ``` diff --git a/snippets/arrayLcm.md b/snippets/arrayLcm.md index 42cb61906..f77797c4c 100644 --- a/snippets/arrayLcm.md +++ b/snippets/arrayLcm.md @@ -7,9 +7,12 @@ Use `Array.reduce()` and the `lcm` formula (uses recursion) to calculate the low ```js const arrayLcm = arr => { const gcd = (x, y) => !y ? x : gcd(y, x % y); - const lcm = (x, y) => (x * y) / gcd(x, y); - return arr.reduce((a, b) => lcm(a, b)); -}; -// arrayLcm([1,2,3,4,5]) -> 60 -// arrayLcm([4,8,12]) -> 24 + const lcm = (x, y) => (x*y)/gcd(x, y); + return arr.reduce((a,b) => lcm(a,b)); +} +``` + +```js +arrayLcm([1,2,3,4,5]) -> 60 +arrayLcm([4,8,12]) -> 24 ``` diff --git a/snippets/arrayMax.md b/snippets/arrayMax.md index 0c0022996..3e1b5c5e8 100644 --- a/snippets/arrayMax.md +++ b/snippets/arrayMax.md @@ -6,5 +6,8 @@ Use `Math.max()` combined with the spread operator (`...`) to get the maximum va ```js const arrayMax = arr => Math.max(...arr); -// arrayMax([10, 1, 5]) -> 10 +``` + +```js +arrayMax([10, 1, 5]) -> 10 ``` diff --git a/snippets/arrayMin.md b/snippets/arrayMin.md index 5bdd95559..171d60977 100644 --- a/snippets/arrayMin.md +++ b/snippets/arrayMin.md @@ -6,5 +6,8 @@ Use `Math.min()` combined with the spread operator (`...`) to get the minimum va ```js const arrayMin = arr => Math.min(...arr); -// arrayMin([10, 1, 5]) -> 1 +``` + +```js +arrayMin([10, 1, 5]) -> 1 ``` diff --git a/snippets/arraySum.md b/snippets/arraySum.md index 265c7fc60..9c3178d35 100644 --- a/snippets/arraySum.md +++ b/snippets/arraySum.md @@ -6,5 +6,8 @@ Use `Array.reduce()` to add each value to an accumulator, initialized with a val ```js const arraySum = arr => arr.reduce((acc, val) => acc + val, 0); -// arraySum([1,2,3,4]) -> 10 +``` + +```js +arraySum([1,2,3,4]) -> 10 ``` diff --git a/snippets/arrayToHtmlList.md b/snippets/arrayToHtmlList.md index 6577ff663..27a66369f 100644 --- a/snippets/arrayToHtmlList.md +++ b/snippets/arrayToHtmlList.md @@ -5,6 +5,9 @@ Converts the given array elements into `
  • ` tags and appends them to the list Use `Array.map()` and `document.querySelector()` to create a list of html tags. ```js -const arrayToHtmlList = (arr, listID) => arr.map(item => document.querySelector('#' + listID).innerHTML += `
  • ${item}
  • `); -// arrayToHtmlList(['item 1', 'item 2'],'myListID') +const arrayToHtmlList = (arr, listID) => arr.map(item => document.querySelector("#"+listID).innerHTML+=`
  • ${item}
  • `); +``` + +```js +arrayToHtmlList(['item 1', 'item 2'],'myListID') ``` diff --git a/snippets/bottomVisible.md b/snippets/bottomVisible.md index adac44881..485f1879f 100644 --- a/snippets/bottomVisible.md +++ b/snippets/bottomVisible.md @@ -7,5 +7,8 @@ Use `scrollY`, `scrollHeight` and `clientHeight` to determine if the bottom of t ```js const bottomVisible = () => document.documentElement.clientHeight + window.scrollY >= (document.documentElement.scrollHeight || document.documentElement.clientHeight); +``` + +```js // bottomVisible() -> true ``` diff --git a/snippets/call.md b/snippets/call.md index 1cb0d4758..e30b395e0 100644 --- a/snippets/call.md +++ b/snippets/call.md @@ -5,10 +5,11 @@ Given a key and a set of arguments, call them when given a context. Primarily us Use a closure to call a stored key with stored arguments. ```js -const call = (key, ...args) => context => context[ key ](...args); -/* +const call = ( key, ...args ) => context => context[ key ]( ...args ); +``` + +```js Promise.resolve( [ 1, 2, 3 ] ).then( call('map', x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ] const map = call.bind(null, 'map') Promise.resolve( [ 1, 2, 3 ] ).then( map( x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ] -*/ -``` +``` diff --git a/snippets/capitalize.md b/snippets/capitalize.md index 9991e279e..671b27191 100644 --- a/snippets/capitalize.md +++ b/snippets/capitalize.md @@ -8,6 +8,9 @@ Omit the `lowerRest` parameter to keep the rest of the string intact, or set it ```js const capitalize = ([first, ...rest], lowerRest = false) => first.toUpperCase() + (lowerRest ? rest.join('').toLowerCase() : rest.join('')); -// capitalize('myName') -> 'MyName' -// capitalize('myName', true) -> 'Myname' +``` + +```js +capitalize('fooBar') -> 'FooBar' +capitalize('fooBar', true) -> 'Foobar' ``` diff --git a/snippets/capitalizeEveryWord.md b/snippets/capitalizeEveryWord.md index bfaaf00b6..b607f8f58 100644 --- a/snippets/capitalizeEveryWord.md +++ b/snippets/capitalizeEveryWord.md @@ -6,5 +6,8 @@ Use `replace()` to match the first character of each word and `toUpperCase()` to ```js const capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase()); -// capitalizeEveryWord('hello world!') -> 'Hello World!' +``` + +```js +capitalizeEveryWord('hello world!') -> 'Hello World!' ``` diff --git a/snippets/chainAsync.md b/snippets/chainAsync.md index 66fb8a6ab..1fb4067c8 100644 --- a/snippets/chainAsync.md +++ b/snippets/chainAsync.md @@ -6,11 +6,12 @@ Loop through an array of functions containing asynchronous events, calling `next ```js const chainAsync = fns => { let curr = 0; const next = () => fns[curr++](next); next(); }; -/* +``` + +```js chainAsync([ next => { console.log('0 seconds'); setTimeout(next, 1000); }, next => { console.log('1 second'); setTimeout(next, 1000); }, next => { console.log('2 seconds'); } ]) -*/ ``` diff --git a/snippets/chunk.md b/snippets/chunk.md index 8ad2c3ced..122712351 100644 --- a/snippets/chunk.md +++ b/snippets/chunk.md @@ -9,5 +9,8 @@ If the original array can't be split evenly, the final chunk will contain the re ```js const chunk = (arr, size) => Array.from({length: Math.ceil(arr.length / size)}, (v, i) => arr.slice(i * size, i * size + size)); -// chunk([1,2,3,4,5], 2) -> [[1,2],[3,4],[5]] +``` + +```js +chunk([1,2,3,4,5], 2) -> [[1,2],[3,4],[5]] ``` diff --git a/snippets/clampNumber.md b/snippets/clampNumber.md index 8880c4282..1431e6b37 100644 --- a/snippets/clampNumber.md +++ b/snippets/clampNumber.md @@ -1,13 +1,16 @@ ### clampNumber -Clamps `num` within the inclusive range specified by the boundary values `a` and `b` +Clamps `num` within the inclusive range specified by the boundary values `a` and `b`. -If `num` falls within the range, return `num`. +If `num` falls within the range, return `num`. Otherwise, return the nearest number in the range. ```js const clampNumber = (num, a, b) => Math.max(Math.min(num, Math.max(a,b)),Math.min(a,b)); -// clampNumber(2, 3, 5) -> 3 -// clampNumber(1, -1, -5) -> -1 -// clampNumber(3, 2, 4) -> 3 +``` + +```js +clampNumber(2, 3, 5) // 3 +clampNumber(1, -1, -5) // -1 +clampNumber(3, 2, 4) // 3 ``` From 3994e127921cf2d448b2aace6d4d7674ba579b18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 14:05:36 +0100 Subject: [PATCH 16/36] update snippets 16-31 --- snippets/cleanObj.md | 10 ++++++---- snippets/coalesce.md | 7 +++++-- snippets/coalesceFactory.md | 7 +++++-- snippets/collatz.md | 7 +++++-- snippets/collectInto.md | 9 +++++---- snippets/compact.md | 5 ++++- snippets/compose.md | 5 +++-- snippets/countOccurrences.md | 5 ++++- snippets/countVowels.md | 7 +++++-- snippets/currentURL.md | 5 ++++- snippets/curry.md | 7 +++++-- snippets/deepFlatten.md | 5 ++++- snippets/detectDeviceType.md | 9 ++++++--- snippets/difference.md | 5 ++++- snippets/differenceWith.md | 7 +++++-- 15 files changed, 70 insertions(+), 30 deletions(-) diff --git a/snippets/cleanObj.md b/snippets/cleanObj.md index 3ce8d2cdd..57ec325e0 100644 --- a/snippets/cleanObj.md +++ b/snippets/cleanObj.md @@ -16,8 +16,10 @@ const cleanObj = (obj, keysToKeep = [], childIndicator) => {  }); return obj; }; -/* - const testObj = {a: 1, b: 2, children: {a: 1, b: 2}} - cleanObj(testObj, ["a"],"children") // { a: 1, children : { a: 1}} -*/ +``` + +```js +const testObj = {a: 1, b: 2, children: {a: 1, b: 2}} +cleanObj(testObj, ["a"],"children") +console.log(testObj) // { a: 1, children : { a: 1}} ``` diff --git a/snippets/coalesce.md b/snippets/coalesce.md index 1002df4d2..c112c77d4 100644 --- a/snippets/coalesce.md +++ b/snippets/coalesce.md @@ -5,6 +5,9 @@ Returns the first non-null/undefined argument. Use `Array.find()` to return the first non `null`/`undefined` argument. ```js -const coalesce = (...args) => args.find(_ => ![undefined, null].includes(_)); -// coalesce(null,undefined,"",NaN, "Waldo") -> "" +const coalesce = (...args) => args.find(_ => ![undefined, null].includes(_)) +``` + +```js +coalesce(null,undefined,"",NaN, "Waldo") // "" ``` diff --git a/snippets/coalesceFactory.md b/snippets/coalesceFactory.md index 4b9a78924..39bb98714 100644 --- a/snippets/coalesceFactory.md +++ b/snippets/coalesceFactory.md @@ -6,6 +6,9 @@ Use `Array.find()` to return the first argument that returns `true` from the pro ```js const coalesceFactory = valid => (...args) => args.find(valid); -// const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_)) -// customCoalesce(undefined, null, NaN, "", "Waldo") //-> "Waldo" +``` + +```js +const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_)) +customCoalesce(undefined, null, NaN, "", "Waldo") // "Waldo" ``` diff --git a/snippets/collatz.md b/snippets/collatz.md index 8b8903886..fc05b2a5d 100644 --- a/snippets/collatz.md +++ b/snippets/collatz.md @@ -6,6 +6,9 @@ If `n` is even, return `n/2`. Otherwise, return `3n+1`. ```js const collatz = n => (n % 2 == 0) ? (n / 2) : (3 * n + 1); -// collatz(8) --> 4 -// collatz(5) --> 16 +``` + +```js +collatz(8) -> 4 +collatz(5) -> 16 ``` diff --git a/snippets/collectInto.md b/snippets/collectInto.md index 69c036764..141a13fa2 100644 --- a/snippets/collectInto.md +++ b/snippets/collectInto.md @@ -5,12 +5,13 @@ Changes a function that accepts an array into a variadic function. Given a function, return a closure that collects all inputs into an array-accepting function. ```js -const collectInto = fn => (...args) => fn(args); -/* +const collectInto = fn => ( ...args ) => fn( args ); +``` + +```js const Pall = collectInto( Promise.all.bind(Promise) ) let p1 = Promise.resolve(1) let p2 = Promise.resolve(2) let p3 = new Promise((resolve) => setTimeout(resolve,2000,3)) Pall(p1, p2, p3).then(console.log) -*/ -``` +``` diff --git a/snippets/compact.md b/snippets/compact.md index d09160afe..2a9528772 100644 --- a/snippets/compact.md +++ b/snippets/compact.md @@ -6,5 +6,8 @@ Use `Array.filter()` to filter out falsey values (`false`, `null`, `0`, `""`, `u ```js const compact = arr => arr.filter(Boolean); -// compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) -> [ 1, 2, 3, 'a', 's', 34 ] +``` + +```js +compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) -> [ 1, 2, 3, 'a', 's', 34 ] ``` diff --git a/snippets/compose.md b/snippets/compose.md index f6b1ce2ea..dfd40f814 100644 --- a/snippets/compose.md +++ b/snippets/compose.md @@ -7,10 +7,11 @@ The last (rightmost) function can accept one or more arguments; the remaining fu ```js const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args))); -/* +``` + +```js const add5 = x => x + 5 const multiply = (x, y) => x * y const multiplyAndAdd5 = compose(add5, multiply) multiplyAndAdd5(5, 2) -> 15 -*/ ``` diff --git a/snippets/countOccurrences.md b/snippets/countOccurrences.md index f55de0a62..2c1463b02 100644 --- a/snippets/countOccurrences.md +++ b/snippets/countOccurrences.md @@ -6,5 +6,8 @@ Use `Array.reduce()` to increment a counter each time you encounter the specific ```js const countOccurrences = (arr, value) => arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0); -// countOccurrences([1,1,2,1,2,3], 1) -> 3 +``` + +```js +countOccurrences([1,1,2,1,2,3], 1) -> 3 ``` diff --git a/snippets/countVowels.md b/snippets/countVowels.md index c91f09442..47c683eb8 100644 --- a/snippets/countVowels.md +++ b/snippets/countVowels.md @@ -6,6 +6,9 @@ Use a regular expression to count the number of vowels `(A, E, I, O, U)` in a `s ```js const countVowels = str => (str.match(/[aeiou]/ig) || []).length; -// countVowels('foobar') -> 3 -// countVowels('gym') -> 0 +``` + +```js +countVowels('foobar') -> 3 +countVowels('gym') -> 0 ``` diff --git a/snippets/currentURL.md b/snippets/currentURL.md index a6482a689..7e8965d92 100644 --- a/snippets/currentURL.md +++ b/snippets/currentURL.md @@ -6,5 +6,8 @@ Use `window.location.href` to get current URL. ```js const currentURL = () => window.location.href; -// currentUrl() -> 'https://google.com' +``` + +```js +currentUrl() -> 'https://google.com' ``` diff --git a/snippets/curry.md b/snippets/curry.md index c88e3418a..f1806d395 100644 --- a/snippets/curry.md +++ b/snippets/curry.md @@ -12,6 +12,9 @@ const curry = (fn, arity = fn.length, ...args) => arity <= args.length ? fn(...args) : curry.bind(null, fn, arity, ...args); -// curry(Math.pow)(2)(10) -> 1024 -// curry(Math.min, 3)(10)(50)(2) -> 2 +``` + +```js +curry(Math.pow)(2)(10) -> 1024 +curry(Math.min, 3)(10)(50)(2) -> 2 ``` diff --git a/snippets/deepFlatten.md b/snippets/deepFlatten.md index c6f29fb9b..cea888992 100644 --- a/snippets/deepFlatten.md +++ b/snippets/deepFlatten.md @@ -8,5 +8,8 @@ Recursively flatten each element that is an array. ```js const deepFlatten = arr => [].concat(...arr.map(v => Array.isArray(v) ? deepFlatten(v) : v)); -// deepFlatten([1,[2],[[3],4],5]) -> [1,2,3,4,5] +``` + +```js +deepFlatten([1,[2],[[3],4],5]) -> [1,2,3,4,5] ``` diff --git a/snippets/detectDeviceType.md b/snippets/detectDeviceType.md index 291e148c5..b262e194d 100644 --- a/snippets/detectDeviceType.md +++ b/snippets/detectDeviceType.md @@ -5,7 +5,10 @@ Detects wether the website is being opened in a mobile device or a desktop/lapto Use a regular expression to test the `navigator.userAgent` property to figure out if the device is a mobile device or a desktop/laptop. ```js -const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? 'Mobile' : 'Desktop'; -// detectDeviceType() -> "Mobile" -// detectDeviceType() -> "Desktop" +const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? "Mobile" : "Desktop"; +``` + +```js +detectDeviceType() // "Mobile" +detectDeviceType() // "Desktop" ``` diff --git a/snippets/difference.md b/snippets/difference.md index e78a73340..dce891e60 100644 --- a/snippets/difference.md +++ b/snippets/difference.md @@ -6,5 +6,8 @@ Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values no ```js const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); }; -// difference([1,2,3], [1,2,4]) -> [3] +``` + +```js +difference([1,2,3], [1,2,4]) -> [3] ``` diff --git a/snippets/differenceWith.md b/snippets/differenceWith.md index 02f686f4b..f5ad345d6 100644 --- a/snippets/differenceWith.md +++ b/snippets/differenceWith.md @@ -5,6 +5,9 @@ Filters out all values from an array for which the comparator function does not Use `Array.filter()` and `Array.find()` to find the appropriate values. ```js -const differenceWith = (arr, val, comp) => arr.filter(a => !val.find(b => comp(a, b))); -// differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) -> [1, 1.2] +const differenceWith = (arr, val, comp) => arr.filter(a => !val.find(b => comp(a, b))) +``` + +```js +differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) // [1, 1.2] ``` From 0001ff4dcbef6d8d4402ba2d353ec4b332688046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 14:10:38 +0100 Subject: [PATCH 17/36] update snippets 32-47 --- snippets/cleanObj.md | 3 +-- snippets/digitize.md | 7 +++++-- snippets/distance.md | 5 ++++- snippets/distinctValuesOfArray.md | 5 ++++- snippets/dropElements.md | 5 ++++- snippets/dropRight.md | 9 ++++++--- snippets/elementIsVisibleInViewport.md | 9 ++++++--- snippets/escapeRegExp.md | 5 ++++- snippets/everyNth.md | 5 ++++- snippets/extendHex.md | 9 ++++++--- snippets/factorial.md | 5 ++++- snippets/fibonacci.md | 5 ++++- snippets/fibonacciCountUntilNum.md | 7 +++++-- snippets/fibonacciUntilNum.md | 7 +++++-- snippets/filterNonUnique.md | 5 ++++- snippets/flatten.md | 7 +++++-- 16 files changed, 71 insertions(+), 27 deletions(-) diff --git a/snippets/cleanObj.md b/snippets/cleanObj.md index 57ec325e0..3f5207369 100644 --- a/snippets/cleanObj.md +++ b/snippets/cleanObj.md @@ -20,6 +20,5 @@ const cleanObj = (obj, keysToKeep = [], childIndicator) => { ```js const testObj = {a: 1, b: 2, children: {a: 1, b: 2}} -cleanObj(testObj, ["a"],"children") -console.log(testObj) // { a: 1, children : { a: 1}} +cleanObj(testObj, ["a"],"children") // { a: 1, children : { a: 1}} ``` diff --git a/snippets/digitize.md b/snippets/digitize.md index 6a48fafcb..9d52fd04b 100644 --- a/snippets/digitize.md +++ b/snippets/digitize.md @@ -6,6 +6,9 @@ Convert the number to a string, using spread operators in ES6(`[...string]`) bui Use `Array.map()` and `parseInt()` to transform each value to an integer. ```js -const digitize = n => [...'' + n].map(i => parseInt(i)); -// digitize(2334) -> [2, 3, 3, 4] +const digitize = n => [...''+n].map(i => parseInt(i)); +``` + +```js +differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) // [1, 1.2] ``` diff --git a/snippets/distance.md b/snippets/distance.md index 5595ef188..543c763a6 100644 --- a/snippets/distance.md +++ b/snippets/distance.md @@ -6,5 +6,8 @@ Use `Math.hypot()` to calculate the Euclidean distance between two points. ```js const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0); -// distance(1,1, 2,3) -> 2.23606797749979 +``` + +```js +distance(1,1, 2,3) -> 2.23606797749979 ``` diff --git a/snippets/distinctValuesOfArray.md b/snippets/distinctValuesOfArray.md index 24c0c60c0..374e24cef 100644 --- a/snippets/distinctValuesOfArray.md +++ b/snippets/distinctValuesOfArray.md @@ -6,5 +6,8 @@ Use ES6 `Set` and the `...rest` operator to discard all duplicated values. ```js const distinctValuesOfArray = arr => [...new Set(arr)]; -// distinctValuesOfArray([1,2,2,3,4,4,5]) -> [1,2,3,4,5] +``` + +```js +distinctValuesOfArray([1,2,2,3,4,4,5]) -> [1,2,3,4,5] ``` diff --git a/snippets/dropElements.md b/snippets/dropElements.md index adc81d79d..064a16d22 100644 --- a/snippets/dropElements.md +++ b/snippets/dropElements.md @@ -10,5 +10,8 @@ const dropElements = (arr, func) => { while (arr.length > 0 && !func(arr[0])) arr = arr.slice(1); return arr; }; -// dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4] +``` + +```js +dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4] ``` diff --git a/snippets/dropRight.md b/snippets/dropRight.md index 3e6716f0e..cdf8fd458 100644 --- a/snippets/dropRight.md +++ b/snippets/dropRight.md @@ -6,7 +6,10 @@ Use `Array.slice()` to slice the remove the specified number of elements from th ```js const dropRight = (arr, n = 1) => arr.slice(0, -n); -// dropRight([1,2,3]) -> [1,2] -// dropRight([1,2,3], 2) -> [1] -// dropRight([1,2,3], 42) -> [] +``` + +```js +dropRight([1,2,3]) // [1,2] +dropRight([1,2,3], 2) // [1] +dropRight([1,2,3], 42) // [] ``` diff --git a/snippets/elementIsVisibleInViewport.md b/snippets/elementIsVisibleInViewport.md index 01015d4fc..83e6afe71 100644 --- a/snippets/elementIsVisibleInViewport.md +++ b/snippets/elementIsVisibleInViewport.md @@ -16,7 +16,10 @@ const elementIsVisibleInViewport = (el, partiallyVisible = false) => { ((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth)) : top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth; }; -// e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10} -// elementIsVisibleInViewport(el) -> false (not fully visible) -// elementIsVisibleInViewport(el, true) -> true (partially visible) +``` + +```js +// e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10} +elementIsVisibleInViewport(el) -> false // (not fully visible) +elementIsVisibleInViewport(el, true) -> true // (partially visible) ``` diff --git a/snippets/escapeRegExp.md b/snippets/escapeRegExp.md index caed74069..7fdbff462 100644 --- a/snippets/escapeRegExp.md +++ b/snippets/escapeRegExp.md @@ -6,5 +6,8 @@ Use `replace()` to escape special characters. ```js const escapeRegExp = str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); -// escapeRegExp('(test)') -> \\(test\\) +``` + +```js +escapeRegExp('(test)') -> \\(test\\) ``` diff --git a/snippets/everyNth.md b/snippets/everyNth.md index f326ebe2b..6aa78ac69 100644 --- a/snippets/everyNth.md +++ b/snippets/everyNth.md @@ -6,5 +6,8 @@ Use `Array.filter()` to create a new array that contains every nth element of a ```js const everyNth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1); -// everyNth([1,2,3,4,5,6], 2) -> [ 2, 4, 6 ] +``` + +```js +everyNth([1,2,3,4,5,6], 2) -> [ 2, 4, 6 ] ``` diff --git a/snippets/extendHex.md b/snippets/extendHex.md index a134ebd7b..40253a7f1 100644 --- a/snippets/extendHex.md +++ b/snippets/extendHex.md @@ -6,7 +6,10 @@ Use `Array.map()`, `split()` and `Array.join()` to join the mapped array for con `String.slice()` is used to remove `#` from string start since it's added once. ```js const extendHex = shortHex => - '#' + shortHex.slice(shortHex.startsWith('#') ? 1 : 0).split('').map(x => x + x).join(''); -// extendHex('#03f') -> '#0033ff' -// extendHex('05a') -> '#0055aa' + '#' + shortHex.slice(shortHex.startsWith('#') ? 1 : 0).split('').map(x => x+x).join('') +``` + +```js +extendHex('#03f') // '#0033ff' +extendHex('05a') // '#0055aa' ``` diff --git a/snippets/factorial.md b/snippets/factorial.md index e0afbd2c3..de604f52c 100644 --- a/snippets/factorial.md +++ b/snippets/factorial.md @@ -11,5 +11,8 @@ Throws an exception if `n` is a negative number. const factorial = n => n < 0 ? (() => { throw new TypeError('Negative numbers are not allowed!'); })() : n <= 1 ? 1 : n * factorial(n - 1); -// factorial(6) -> 720 +``` + +```js +factorial(6) -> 720 ``` diff --git a/snippets/fibonacci.md b/snippets/fibonacci.md index e5e2e15fd..9addac34a 100644 --- a/snippets/fibonacci.md +++ b/snippets/fibonacci.md @@ -8,5 +8,8 @@ Use `Array.reduce()` to add values into the array, using the sum of the last two ```js const fibonacci = n => Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []); -// fibonacci(5) -> [0,1,1,2,3] +``` + +```js +factorial(6) -> 720 ``` diff --git a/snippets/fibonacciCountUntilNum.md b/snippets/fibonacciCountUntilNum.md index 8cf904ef0..82f53ea98 100644 --- a/snippets/fibonacciCountUntilNum.md +++ b/snippets/fibonacciCountUntilNum.md @@ -6,6 +6,9 @@ Use a mathematical formula to calculate the number of fibonacci numbers until `n ```js const fibonacciCountUntilNum = num => - Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2)); -// fibonacciCountUntilNum(10) -> 7 + Math.ceil(Math.log(num * Math.sqrt(5) + 1/2) / Math.log((Math.sqrt(5)+1)/2)); +``` + +```js +fibonacciCountUntilNum(10) -> 7 ``` diff --git a/snippets/fibonacciUntilNum.md b/snippets/fibonacciUntilNum.md index 5e1b2c9d7..aef99ca37 100644 --- a/snippets/fibonacciUntilNum.md +++ b/snippets/fibonacciUntilNum.md @@ -10,6 +10,9 @@ Uses a mathematical formula to calculate the length of the array required. const fibonacciUntilNum = num => { let n = Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2)); return Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []); -}; -// fibonacciUntilNum(15) -> [0,1,1,2,3,5,8,13] +} +``` + +```js +fibonacciCountUntilNum(10) // 7 ``` diff --git a/snippets/filterNonUnique.md b/snippets/filterNonUnique.md index 059d79aa5..1568afbf8 100644 --- a/snippets/filterNonUnique.md +++ b/snippets/filterNonUnique.md @@ -6,5 +6,8 @@ Use `Array.filter()` for an array containing only the unique values. ```js const filterNonUnique = arr => arr.filter(i => arr.indexOf(i) === arr.lastIndexOf(i)); -// filterNonUnique([1,2,2,3,4,4,5]) -> [1,3,5] +``` + +```js +filterNonUnique([1,2,2,3,4,4,5]) -> [1,3,5] ``` diff --git a/snippets/flatten.md b/snippets/flatten.md index 0efd29071..29cb52ad1 100644 --- a/snippets/flatten.md +++ b/snippets/flatten.md @@ -5,6 +5,9 @@ Flattens an array. Use a new array and concatenate it with the spread input array causing a shallow denesting of any contained arrays. ```js -const flatten = arr => [ ].concat(...arr); -// flatten([1,[2],3,4]) -> [1,2,3,4] +const flatten = arr => [ ].concat( ...arr ); +``` + +```js +flatten([1,[2],3,4]) // [1,2,3,4] ``` From b5c43589956036b27223d0d78303ffc25a098aef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 14:16:05 +0100 Subject: [PATCH 18/36] update snippets 47-62 --- snippets/flattenDepth.md | 5 ++++- snippets/flip.md | 7 ++++--- snippets/fromCamelCase.md | 9 ++++++--- snippets/functionName.md | 5 ++++- snippets/gcd.md | 5 ++++- snippets/getDaysDiffBetweenDates.md | 5 ++++- snippets/getScrollPosition.md | 5 ++++- snippets/getType.md | 5 ++++- snippets/getURLParameters.md | 5 ++++- snippets/groupBy.md | 7 +++++-- snippets/hammingDistance.md | 5 ++++- snippets/head.md | 5 ++++- snippets/hexToRGB.md | 9 ++++++--- snippets/initial.md | 5 ++++- snippets/initialize2DArray.md | 5 ++++- 15 files changed, 65 insertions(+), 22 deletions(-) diff --git a/snippets/flattenDepth.md b/snippets/flattenDepth.md index c07b837ff..6034b9135 100644 --- a/snippets/flattenDepth.md +++ b/snippets/flattenDepth.md @@ -11,5 +11,8 @@ Omit the second element, `depth` to flatten only to a depth of `1` (single flatt const flattenDepth = (arr, depth = 1) => depth != 1 ? arr.reduce((a, v) => a.concat(Array.isArray(v) ? flattenDepth(v, depth - 1) : v), []) : arr.reduce((a, v) => a.concat(v), []); -// flattenDepth([1,[2],[[[3],4],5]], 2) -> [1,2,[3],4,5] +``` + +```js +flatten([1,[2],3,4]) -> [1,2,3,4] ``` diff --git a/snippets/flip.md b/snippets/flip.md index 004d838d2..1c3ce1afc 100644 --- a/snippets/flip.md +++ b/snippets/flip.md @@ -6,7 +6,9 @@ Return a closure that takes variadic inputs, and splices the last argument to ma ```js const flip = fn => (...args) => fn(args.pop(), ...args); -/* +``` + +```js let a = {name: 'John Smith'} let b = {} const mergeFrom = flip(Object.assign) @@ -14,5 +16,4 @@ let mergePerson = mergeFrom.bind(null, a) mergePerson(b) // == b b = {} Object.assign(b, a) // == b -*/ -``` +``` diff --git a/snippets/fromCamelCase.md b/snippets/fromCamelCase.md index 3d480dc85..14c21bc4c 100644 --- a/snippets/fromCamelCase.md +++ b/snippets/fromCamelCase.md @@ -9,7 +9,10 @@ Omit the second argument to use a default separator of `_`. const fromCamelCase = (str, separator = '_') => str.replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2') .replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + separator + '$2').toLowerCase(); -// fromCamelCase('someDatabaseFieldName', ' ') -> 'some database field name' -// fromCamelCase('someLabelThatNeedsToBeCamelized', '-') -> 'some-label-that-needs-to-be-camelized' -// fromCamelCase('someJavascriptProperty', '_') -> 'some_javascript_property' +``` + +```js +fromCamelCase('someDatabaseFieldName', ' ') -> 'some database field name' +fromCamelCase('someLabelThatNeedsToBeCamelized', '-') -> 'some-label-that-needs-to-be-camelized' +fromCamelCase('someJavascriptProperty', '_') -> 'some_javascript_property' ``` diff --git a/snippets/functionName.md b/snippets/functionName.md index 54603d39c..1ad25772a 100644 --- a/snippets/functionName.md +++ b/snippets/functionName.md @@ -6,5 +6,8 @@ Use `console.debug()` and the `name` property of the passed method to log the me ```js const functionName = fn => (console.debug(fn.name), fn); -// functionName(Math.max) -> max (logged in debug channel of console) +``` + +```js +functionName(Math.max) -> max (logged in debug channel of console) ``` diff --git a/snippets/gcd.md b/snippets/gcd.md index 34fb21833..8affada12 100644 --- a/snippets/gcd.md +++ b/snippets/gcd.md @@ -8,5 +8,8 @@ Otherwise, return the GCD of `y` and the remainder of the division `x/y`. ```js const gcd = (x, y) => !y ? x : gcd(y, x % y); -// gcd (8, 36) -> 4 +``` + +```js +gcd (8, 36) -> 4 ``` diff --git a/snippets/getDaysDiffBetweenDates.md b/snippets/getDaysDiffBetweenDates.md index 3b63440c1..6c73366ac 100644 --- a/snippets/getDaysDiffBetweenDates.md +++ b/snippets/getDaysDiffBetweenDates.md @@ -6,5 +6,8 @@ Calculate the difference (in days) between two `Date` objects. ```js const getDaysDiffBetweenDates = (dateInitial, dateFinal) => (dateFinal - dateInitial) / (1000 * 3600 * 24); -// getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) -> 9 +``` + +```js +getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) -> 9 ``` diff --git a/snippets/getScrollPosition.md b/snippets/getScrollPosition.md index b51ec3241..2708210a1 100644 --- a/snippets/getScrollPosition.md +++ b/snippets/getScrollPosition.md @@ -9,5 +9,8 @@ You can omit `el` to use a default value of `window`. const getScrollPosition = (el = window) => ({x: (el.pageXOffset !== undefined) ? el.pageXOffset : el.scrollLeft, y: (el.pageYOffset !== undefined) ? el.pageYOffset : el.scrollTop}); -// getScrollPosition() -> {x: 0, y: 200} +``` + +```js +getScrollPosition() -> {x: 0, y: 200} ``` diff --git a/snippets/getType.md b/snippets/getType.md index 53f660420..f0b9be8d5 100644 --- a/snippets/getType.md +++ b/snippets/getType.md @@ -7,5 +7,8 @@ Returns lowercased constructor name of value, "undefined" or "null" if value is ```js const getType = v => v === undefined ? 'undefined' : v === null ? 'null' : v.constructor.name.toLowerCase(); -// getType(new Set([1,2,3])) -> "set" +``` + +```js +getType(new Set([1,2,3])) -> "set" ``` diff --git a/snippets/getURLParameters.md b/snippets/getURLParameters.md index 77dddd532..5f4690bfc 100644 --- a/snippets/getURLParameters.md +++ b/snippets/getURLParameters.md @@ -10,5 +10,8 @@ const getURLParameters = url => url.match(/([^?=&]+)(=([^&]*))/g).reduce( (a, v) => (a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1), a), {} ); -// getURLParameters('http://url.com/page?name=Adam&surname=Smith') -> {name: 'Adam', surname: 'Smith'} +``` + +```js +getURLParameters('http://url.com/page?name=Adam&surname=Smith') -> {name: 'Adam', surname: 'Smith'} ``` diff --git a/snippets/groupBy.md b/snippets/groupBy.md index d83795fdc..4b301e2b8 100644 --- a/snippets/groupBy.md +++ b/snippets/groupBy.md @@ -9,6 +9,9 @@ Use `Array.reduce()` to create an object, where the keys are produced from the m const groupBy = (arr, func) => arr.map(typeof func === 'function' ? func : val => val[func]) .reduce((acc, val, i) => { acc[val] = (acc[val] || []).concat(arr[i]); return acc; }, {}); -// groupBy([6.1, 4.2, 6.3], Math.floor) -> {4: [4.2], 6: [6.1, 6.3]} -// groupBy(['one', 'two', 'three'], 'length') -> {3: ['one', 'two'], 5: ['three']} +``` + +```js +groupBy([6.1, 4.2, 6.3], Math.floor) -> {4: [4.2], 6: [6.1, 6.3]} +groupBy(['one', 'two', 'three'], 'length') -> {3: ['one', 'two'], 5: ['three']} ``` diff --git a/snippets/hammingDistance.md b/snippets/hammingDistance.md index 97c08d2aa..e0f22dba7 100644 --- a/snippets/hammingDistance.md +++ b/snippets/hammingDistance.md @@ -8,5 +8,8 @@ Count and return the number of `1`s in the string, using `match(/1/g)`. ```js const hammingDistance = (num1, num2) => ((num1 ^ num2).toString(2).match(/1/g) || '').length; -// hammingDistance(2,3) -> 1 +``` + +```js +hammingDistance(2,3) -> 1 ``` diff --git a/snippets/head.md b/snippets/head.md index ece926a50..30b8951a6 100644 --- a/snippets/head.md +++ b/snippets/head.md @@ -6,5 +6,8 @@ Use `arr[0]` to return the first element of the passed array. ```js const head = arr => arr[0]; -// head([1,2,3]) -> 1 +``` + +```js +head([1,2,3]) -> 1 ``` diff --git a/snippets/hexToRGB.md b/snippets/hexToRGB.md index c86004039..89db399ad 100644 --- a/snippets/hexToRGB.md +++ b/snippets/hexToRGB.md @@ -16,7 +16,10 @@ const hexToRGB = hex => { ((h & (alpha ? 0x0000ff00 : 0x0000ff)) >>> (alpha ? 8 : 0)) + (alpha ? `, ${(h & 0x000000ff)}` : '') + ')'; }; -// hexToRGB('#27ae60ff') -> 'rgba(39, 174, 96, 255)' -// hexToRGB('27ae60') -> 'rgb(39, 174, 96)' -// hexToRGB('#fff') -> 'rgb(255, 255, 255)' +``` + +```js +hexToRGB('#27ae60ff') // 'rgba(39, 174, 96, 255)' +hexToRGB('27ae60') // 'rgb(39, 174, 96)' +hexToRGB('#fff') // 'rgb(255, 255, 255)' ``` diff --git a/snippets/initial.md b/snippets/initial.md index 7b1c5c68c..87827c437 100644 --- a/snippets/initial.md +++ b/snippets/initial.md @@ -6,5 +6,8 @@ Use `arr.slice(0,-1)` to return all but the last element of the array. ```js const initial = arr => arr.slice(0, -1); -// initial([1,2,3]) -> [1,2] +``` + +```js +initial([1,2,3]) -> [1,2] ``` diff --git a/snippets/initialize2DArray.md b/snippets/initialize2DArray.md index 0cb1df126..ec7bf7681 100644 --- a/snippets/initialize2DArray.md +++ b/snippets/initialize2DArray.md @@ -6,5 +6,8 @@ Use `Array.map()` to generate h rows where each is a new array of size w initial ```js const initialize2DArray = (w, h, val = null) => Array(h).fill().map(() => Array(w).fill(val)); -// initializeArrayWithRange(2, 2, 0) -> [[0,0], [0,0]] +``` + +```js +initializeArrayWithRange(2, 2, 0) -> [[0,0], [0,0]] ``` From c829ed692e0988f5b5494fc7b270e78a9208a62a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 14:23:06 +0100 Subject: [PATCH 19/36] update snippets 62-78 --- snippets/JSONToDate.md | 5 ++++- snippets/inRange.md | 21 ++++++++++++--------- snippets/initialize2DArray.md | 2 +- snippets/initializeArrayWithRange.md | 7 +++++-- snippets/initializeArrayWithValues.md | 5 ++++- snippets/intersection.md | 5 ++++- snippets/isArmstrongNumber.md | 11 +++++++---- snippets/isArray.md | 7 +++++-- snippets/isBoolean.md | 7 +++++-- snippets/isDivisible.md | 5 ++++- snippets/isEven.md | 5 ++++- snippets/isFunction.md | 7 +++++-- snippets/isNumber.md | 7 +++++-- snippets/isPrime.md | 9 ++++++--- snippets/isString.md | 7 +++++-- snippets/isSymbol.md | 7 +++++-- 16 files changed, 81 insertions(+), 36 deletions(-) diff --git a/snippets/JSONToDate.md b/snippets/JSONToDate.md index 311da31e7..9217b3de3 100644 --- a/snippets/JSONToDate.md +++ b/snippets/JSONToDate.md @@ -9,5 +9,8 @@ const JSONToDate = arr => { const dt = new Date(parseInt(arr.toString().substr(6))); return `${dt.getDate()}/${dt.getMonth() + 1}/${dt.getFullYear()}`; }; -// JSONToDate(/Date(1489525200000)/) -> "14/3/2017" +``` + +```js +JSONToDate(/Date(1489525200000)/) -> "14/3/2017" ``` diff --git a/snippets/inRange.md b/snippets/inRange.md index ab4a610e7..044b32a0c 100644 --- a/snippets/inRange.md +++ b/snippets/inRange.md @@ -1,17 +1,20 @@ ### inRange -Checks if the given number falls within the given range. +Checks if the given number falls within the given range. Use arithmetic comparison to check if the given number is in the specified range. If the second parameter, `end`, is not specified, the range is considered to be from `0` to `start`. ```js -const inRange = (n, start, end = null) => { - if (end && start > end) end = [start, start = end][0]; - return (end == null) ? (n >= 0 && n < start) : (n >= start && n < end); -}; -// inRange(3, 2, 5) -> true -// inRange(3, 4) -> true -// inRange(2, 3, 5) -> false -// inrange(3, 2) -> false +const inRange = (n, start, end=null) => { + if(end && start > end) end = [start, start=end][0]; + return (end == null) ? (n>=0 && n=start && n Array(h).fill().map(() => Array( ``` ```js -initializeArrayWithRange(2, 2, 0) -> [[0,0], [0,0]] +initialize2DArray(2, 2, 0) -> [[0,0], [0,0]] ``` diff --git a/snippets/initializeArrayWithRange.md b/snippets/initializeArrayWithRange.md index 3fefca2ed..8ea87a9c4 100644 --- a/snippets/initializeArrayWithRange.md +++ b/snippets/initializeArrayWithRange.md @@ -8,6 +8,9 @@ You can omit `start` to use a default value of `0`. ```js const initializeArrayWithRange = (end, start = 0) => Array.from({ length: (end + 1) - start }).map((v, i) => i + start); -// initializeArrayWithRange(5) -> [0,1,2,3,4,5] -// initializeArrayWithRange(7, 3) -> [3,4,5,6,7] +``` + +```js +initializeArrayWithRange(5) -> [0,1,2,3,4,5] +initializeArrayWithRange(7, 3) -> [3,4,5,6,7] ``` diff --git a/snippets/initializeArrayWithValues.md b/snippets/initializeArrayWithValues.md index 47459fcdd..a92a09e7a 100644 --- a/snippets/initializeArrayWithValues.md +++ b/snippets/initializeArrayWithValues.md @@ -7,5 +7,8 @@ You can omit `value` to use a default value of `0`. ```js const initializeArrayWithValues = (n, value = 0) => Array(n).fill(value); -// initializeArrayWithValues(5, 2) -> [2,2,2,2,2] +``` + +```js +initializeArrayWithValues(5, 2) -> [2,2,2,2,2] ``` diff --git a/snippets/intersection.md b/snippets/intersection.md index 1c367cd92..0596a04ce 100644 --- a/snippets/intersection.md +++ b/snippets/intersection.md @@ -6,5 +6,8 @@ Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values co ```js const intersection = (a, b) => { const s = new Set(b); return a.filter(x => s.has(x)); }; -// intersection([1,2,3], [4,3,2]) -> [2,3] +``` + +```js +intersection([1,2,3], [4,3,2]) -> [2,3] ``` diff --git a/snippets/isArmstrongNumber.md b/snippets/isArmstrongNumber.md index a680d607e..81f59409e 100644 --- a/snippets/isArmstrongNumber.md +++ b/snippets/isArmstrongNumber.md @@ -6,8 +6,11 @@ Convert the given number into an array of digits. Use `Math.pow()` to get the ap ```js const isArmstrongNumber = digits => - (arr => arr.reduce((a, d) => a + Math.pow(parseInt(d), arr.length), 0) == digits)((digits + '').split('')); -// isArmstrongNumber(1634) -> true -// isArmstrongNumber(371) -> true -// isArmstrongNumber(56) -> false + ( arr => arr.reduce( ( a, d ) => a + Math.pow( parseInt( d ), arr.length ), 0 ) == digits ? true : false )( ( digits+'' ).split( '' ) ); +``` + +```js +isArmstrongNumber(1634) // true +isArmstrongNumber(371) // true +isArmstrongNumber(56) // false ``` diff --git a/snippets/isArray.md b/snippets/isArray.md index f6e410719..28b80c262 100644 --- a/snippets/isArray.md +++ b/snippets/isArray.md @@ -6,6 +6,9 @@ Use `Array.isArray()` to check if a value is classified as an array. ```js const isArray = val => !!val && Array.isArray(val); -// isArray(null) -> false -// isArray([1]) -> true +``` + +```js +isArray(null) -> false +isArray([1]) -> true ``` diff --git a/snippets/isBoolean.md b/snippets/isBoolean.md index ae402c5e4..ad47fa33e 100644 --- a/snippets/isBoolean.md +++ b/snippets/isBoolean.md @@ -6,6 +6,9 @@ Use `typeof` to check if a value is classified as a boolean primitive. ```js const isBoolean = val => typeof val === 'boolean'; -// isBoolean(null) -> false -// isBoolean(false) -> true +``` + +```js +isBoolean(null) -> false +isBoolean(false) -> true ``` diff --git a/snippets/isDivisible.md b/snippets/isDivisible.md index 5adad9453..95919d69d 100644 --- a/snippets/isDivisible.md +++ b/snippets/isDivisible.md @@ -6,5 +6,8 @@ Use the modulo operator (`%`) to check if the remainder is equal to `0`. ```js const isDivisible = (dividend, divisor) => dividend % divisor === 0; -// isDivisible(6,3) -> true +``` + +```js +isDivisible(6,3) -> true ``` diff --git a/snippets/isEven.md b/snippets/isEven.md index 5dfcb414f..b2bb58b58 100644 --- a/snippets/isEven.md +++ b/snippets/isEven.md @@ -7,5 +7,8 @@ Returns `true` if the number is even, `false` if the number is odd. ```js const isEven = num => num % 2 === 0; -// isEven(3) -> false +``` + +```js +isEven(3) -> false ``` diff --git a/snippets/isFunction.md b/snippets/isFunction.md index af5960e00..eae2073e4 100644 --- a/snippets/isFunction.md +++ b/snippets/isFunction.md @@ -6,6 +6,9 @@ Use `typeof` to check if a value is classified as a function primitive. ```js const isFunction = val => val && typeof val === 'function'; -// isFunction('x') -> false -// isFunction(x => x) -> true +``` + +```js +isFunction('x') -> false +isFunction(x => x) -> true ``` diff --git a/snippets/isNumber.md b/snippets/isNumber.md index 83b33bc11..3035a0a3a 100644 --- a/snippets/isNumber.md +++ b/snippets/isNumber.md @@ -6,6 +6,9 @@ Use `typeof` to check if a value is classified as a number primitive. ```js const isNumber = val => typeof val === 'number'; -// isNumber('1') -> false -// isNumber(1) -> true ``` + +```js +isNumber('1') -> false +isNumber(1) -> true +``` \ No newline at end of file diff --git a/snippets/isPrime.md b/snippets/isPrime.md index 6f77ebd6c..2e609028b 100644 --- a/snippets/isPrime.md +++ b/snippets/isPrime.md @@ -2,7 +2,7 @@ Checks if the provided integer is a prime number. -Check numbers from `2` to the square root of the given number. +Check numbers from `2` to the square root of the given number. Return `false` if any of them divides the given number, else return `true`, unless the number is less than `2`. ```js @@ -11,6 +11,9 @@ const isPrime = num => { for (var i = 2; i * i <= boundary; i++) if (num % i == 0) return false; return num >= 2; }; -// isPrime(11) -> true -// isPrime(12) -> false +``` + +```js +isPrime(11) -> true +isPrime(12) -> false ``` diff --git a/snippets/isString.md b/snippets/isString.md index 775e050a4..923bcd174 100644 --- a/snippets/isString.md +++ b/snippets/isString.md @@ -6,6 +6,9 @@ Use `typeof` to check if a value is classified as a string primitive. ```js const isString = val => typeof val === 'string'; -// isString(10) -> false -// isString('10') -> true +``` + +```js +isString(10) -> false +isString('10') -> true ``` diff --git a/snippets/isSymbol.md b/snippets/isSymbol.md index a4ec67dc8..0baa68500 100644 --- a/snippets/isSymbol.md +++ b/snippets/isSymbol.md @@ -6,6 +6,9 @@ Use `typeof` to check if a value is classified as a symbol primitive. ```js const isSymbol = val => typeof val === 'symbol'; -// isSymbol('x') -> false -// isSymbol(Symbol('x')) -> true +``` + +```js +isSymbol('x') -> false +isSymbol(Symbol('x')) -> true ``` From 9ef34b739249be8dd87fcf0f0b5432fbc412baec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 14:33:49 +0100 Subject: [PATCH 20/36] update snippets 78 - 96 --- snippets/JSONToFile.md | 7 +++++-- snippets/last.md | 5 ++++- snippets/lcm.md | 5 ++++- snippets/mapObject.md | 7 ++++--- snippets/median.md | 7 +++++-- snippets/negate.md | 7 +++++-- snippets/nthElement.md | 9 ++++++--- snippets/objectFromPairs.md | 5 ++++- snippets/objectToPairs.md | 5 ++++- snippets/orderBy.md | 5 +++-- snippets/palindrome.md | 7 +++++-- snippets/percentile.md | 7 +++++-- snippets/pick.md | 5 ++++- snippets/pipeFunctions.md | 5 +++-- snippets/powerset.md | 5 ++++- snippets/primes.md | 17 ++++++++++------- snippets/promisify.md | 7 +++++-- snippets/pull.md | 18 ++++++++++-------- 18 files changed, 90 insertions(+), 43 deletions(-) diff --git a/snippets/JSONToFile.md b/snippets/JSONToFile.md index 984e516b6..2e88f336d 100644 --- a/snippets/JSONToFile.md +++ b/snippets/JSONToFile.md @@ -6,6 +6,9 @@ Use `fs.writeFile()`, template literals and `JSON.stringify()` to write a `json` ```js const fs = require('fs'); -const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2)); -// JSONToFile({test: "is passed"}, 'testJsonFile') -> writes the object to 'testJsonFile.json' +const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2)) +``` + +```js +JSONToFile({test: "is passed"}, 'testJsonFile') // writes the object to 'testJsonFile.json' ``` diff --git a/snippets/last.md b/snippets/last.md index 481e2d6e0..f26427591 100644 --- a/snippets/last.md +++ b/snippets/last.md @@ -6,5 +6,8 @@ Use `arr.length - 1` to compute the index of the last element of the given array ```js const last = arr => arr[arr.length - 1]; -// last([1,2,3]) -> 3 +``` + +```js +last([1,2,3]) -> 3 ``` diff --git a/snippets/lcm.md b/snippets/lcm.md index ef8ea7fdc..43e65c12f 100644 --- a/snippets/lcm.md +++ b/snippets/lcm.md @@ -10,5 +10,8 @@ const lcm = (x, y) => { const gcd = (x, y) => !y ? x : gcd(y, x % y); return Math.abs(x * y) / (gcd(x, y)); }; -// lcm(12,7) -> 84 +``` + +```js +lcm(12,7) -> 84 ``` diff --git a/snippets/mapObject.md b/snippets/mapObject.md index f9d65ee32..3eebc515f 100644 --- a/snippets/mapObject.md +++ b/snippets/mapObject.md @@ -6,9 +6,10 @@ Use an anonymous inner function scope to declare an undefined memory space, usin ```js const mapObject = (arr, fn) => - (a => (a = [arr, arr.map(fn)], a[0].reduce((acc, val, ind) => (acc[val] = a[1][ind], acc), {})))(); -/* + (a => (a = [arr, arr.map(fn)], a[0].reduce( (acc,val,ind) => (acc[val] = a[1][ind], acc), {}) )) ( ); +``` + +```js const squareIt = arr => mapObject(arr, a => a*a) squareIt([1,2,3]) // { 1: 1, 2: 4, 3: 9 } -*/ ``` diff --git a/snippets/median.md b/snippets/median.md index c7eea609c..e472e7c0d 100644 --- a/snippets/median.md +++ b/snippets/median.md @@ -10,6 +10,9 @@ const median = arr => { const mid = Math.floor(arr.length / 2), nums = [...arr].sort((a, b) => a - b); return arr.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2; }; -// median([5,6,50,1,-5]) -> 5 -// median([0,10,-2,7]) -> 3.5 +``` + +```js +median([5,6,50,1,-5]) -> 5 +median([0,10,-2,7]) -> 3.5 ``` diff --git a/snippets/negate.md b/snippets/negate.md index 5f14e4a0f..739ad97c1 100644 --- a/snippets/negate.md +++ b/snippets/negate.md @@ -6,6 +6,9 @@ Take a predicate function and apply `not` to it with its arguments. ```js const negate = func => (...args) => !func(...args); -// filter([1, 2, 3, 4, 5, 6], negate(isEven)) -> [1, 3, 5] -// negate(isOdd)(1) -> false +``` + +```js +filter([1, 2, 3, 4, 5, 6], negate(isEven)) -> [1, 3, 5] +negate(isOdd)(1) -> false ``` diff --git a/snippets/nthElement.md b/snippets/nthElement.md index be1da2ce0..9c1fbf387 100644 --- a/snippets/nthElement.md +++ b/snippets/nthElement.md @@ -7,7 +7,10 @@ If the index is out of bounds, return `[]`. Omit the second argument, `n`, to get the first element of the array. ```js -const nthElement = (arr, n = 0) => (n > 0 ? arr.slice(n, n + 1) : arr.slice(n))[0]; -// nthElement(['a','b','c'],1) -> 'b' -// nthElement(['a','b','b'],-3) -> 'a' +const nthElement = (arr, n=0) => (n>0? arr.slice(n,n+1) : arr.slice(n))[0]; +``` + +```js +nthElement(['a','b','c'],1) // 'b' +nthElement(['a','b','b'],-3) // 'a' ``` diff --git a/snippets/objectFromPairs.md b/snippets/objectFromPairs.md index ebdacb92c..2ed208f44 100644 --- a/snippets/objectFromPairs.md +++ b/snippets/objectFromPairs.md @@ -6,5 +6,8 @@ Use `Array.reduce()` to create and combine key-value pairs. ```js const objectFromPairs = arr => arr.reduce((a, v) => (a[v[0]] = v[1], a), {}); -// objectFromPairs([['a',1],['b',2]]) -> {a: 1, b: 2} +``` + +```js +objectFromPairs([['a',1],['b',2]]) -> {a: 1, b: 2} ``` diff --git a/snippets/objectToPairs.md b/snippets/objectToPairs.md index 7a6079650..6ea5fc051 100644 --- a/snippets/objectToPairs.md +++ b/snippets/objectToPairs.md @@ -6,5 +6,8 @@ Use `Object.keys()` and `Array.map()` to iterate over the object's keys and prod ```js const objectToPairs = obj => Object.keys(obj).map(k => [k, obj[k]]); -// objectToPairs({a: 1, b: 2}) -> [['a',1],['b',2]]) +``` + +```js +objectToPairs({a: 1, b: 2}) -> [['a',1],['b',2]]) ``` diff --git a/snippets/orderBy.md b/snippets/orderBy.md index c80b3667f..ab5581dc3 100644 --- a/snippets/orderBy.md +++ b/snippets/orderBy.md @@ -16,10 +16,11 @@ const orderBy = (arr, props, orders) => return acc; }, 0) ); -/* +``` + +```js const users = [{ 'name': 'fred', 'age': 48 },{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 },{ 'name': 'barney', 'age': 34 }]; orderby(users, ['name', 'age'], ['asc', 'desc']) -> [{name: 'barney', age: 36}, {name: 'barney', age: 34}, {name: 'fred', age: 48}, {name: 'fred', age: 40}] orderby(users, ['name', 'age']) -> [{name: 'barney', age: 34}, {name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}] -*/ ``` diff --git a/snippets/palindrome.md b/snippets/palindrome.md index cca1bb729..820162617 100644 --- a/snippets/palindrome.md +++ b/snippets/palindrome.md @@ -10,5 +10,8 @@ const palindrome = str => { const s = str.toLowerCase().replace(/[\W_]/g,''); return s === s.split('').reverse().join(''); } -// palindrome('taco cat') -> true - ``` +``` + +```js +palindrome('taco cat') -> true +``` diff --git a/snippets/percentile.md b/snippets/percentile.md index 7485494e2..5287521b0 100644 --- a/snippets/percentile.md +++ b/snippets/percentile.md @@ -7,5 +7,8 @@ Use `Array.reduce()` to calculate how many numbers are below the value and how m ```js const percentile = (arr, val) => 100 * arr.reduce((acc,v) => acc + (v < val ? 1 : 0) + (v === val ? 0.5 : 0), 0) / arr.length; -// percentile([1,2,3,4,5,6,7,8,9,10], 6) -> 55 - ``` +``` + +```js +percentile([1,2,3,4,5,6,7,8,9,10], 6) -> 55 +``` diff --git a/snippets/pick.md b/snippets/pick.md index 668c9d30c..0bfeba286 100644 --- a/snippets/pick.md +++ b/snippets/pick.md @@ -7,5 +7,8 @@ Use `Array.reduce()` to convert the filtered/picked keys back to an object with ```js const pick = (obj, arr) => arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {}); -// pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) -> { 'a': 1, 'c': 3 } +``` + +```js +pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) -> { 'a': 1, 'c': 3 } ``` diff --git a/snippets/pipeFunctions.md b/snippets/pipeFunctions.md index 04c9f3ee1..99970bae0 100644 --- a/snippets/pipeFunctions.md +++ b/snippets/pipeFunctions.md @@ -7,10 +7,11 @@ The first (leftmost) function can accept one or more arguments; the remaining fu ```js const pipeFunctions = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args))); -/* +``` + +```js const add5 = x => x + 5 const multiply = (x, y) => x * y const multiplyAndAdd5 = pipeFunctions(multiply, add5) multiplyAndAdd5(5, 2) -> 15 -*/ ``` diff --git a/snippets/powerset.md b/snippets/powerset.md index 09b233212..dc91406e9 100644 --- a/snippets/powerset.md +++ b/snippets/powerset.md @@ -7,5 +7,8 @@ Use `Array.reduce()` combined with `Array.map()` to iterate over elements and co ```js const powerset = arr => arr.reduce((a, v) => a.concat(a.map(r => [v].concat(r))), [[]]); -// powerset([1,2]) -> [[], [1], [2], [2,1]] +``` + +```js +powerset([1,2]) -> [[], [1], [2], [2,1]] ``` diff --git a/snippets/primes.md b/snippets/primes.md index 109192e7c..87ac21a70 100644 --- a/snippets/primes.md +++ b/snippets/primes.md @@ -1,4 +1,4 @@ -### primes +### primes Generates primes up to a given number, using the Sieve of Eratosthenes. @@ -6,11 +6,14 @@ Generate an array from `2` to the given number. Use `Array.filter()` to filter o ```js const primes = num => { - let arr = Array.from({length: num - 1}).map((x, i) => i + 2), - sqroot = Math.floor(Math.sqrt(num)), - numsTillSqroot = Array.from({length: sqroot - 1}).map((x, i) => i + 2); - numsTillSqroot.forEach(x => arr = arr.filter(y => ((y % x) !== 0) || (y == x))); + let arr = Array.from({length:num-1}).map((x,i)=> i+2), + sqroot = Math.floor(Math.sqrt(num)), + numsTillSqroot = Array.from({length:sqroot-1}).map((x,i)=> i+2); + numsTillSqroot.forEach(x => arr = arr.filter(y => ((y%x)!==0)||(y==x))); return arr; -}; -// primes(10) -> [2,3,5,7] +} +``` + +```js +primes(10) // [2,3,5,7] ``` diff --git a/snippets/promisify.md b/snippets/promisify.md index 80a7d48d0..4769fa5e9 100644 --- a/snippets/promisify.md +++ b/snippets/promisify.md @@ -14,6 +14,9 @@ const promisify = func => func(...args, (err, result) => err ? reject(err) : resolve(result)) ); -// const delay = promisify((d, cb) => setTimeout(cb, d)) -// delay(2000).then(() => console.log('Hi!')) -> Promise resolves after 2s +``` + +```js +const delay = promisify((d, cb) => setTimeout(cb, d)) +delay(2000).then(() => console.log('Hi!')) -> // Promise resolves after 2s ``` diff --git a/snippets/pull.md b/snippets/pull.md index 3848e27dd..52e0f3ea6 100644 --- a/snippets/pull.md +++ b/snippets/pull.md @@ -14,12 +14,14 @@ const pull = (arr, ...args) => { arr.length = 0; pulled.forEach(v => arr.push(v)); }; - -// let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c']; -// pull(myArray1, 'a', 'c'); -// console.log(myArray1) -> [ 'b', 'b' ] - -// let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c']; -// pull(myArray2, ['a', 'c']); -// console.log(myArray2) -> [ 'b', 'b' ] +``` + +```js +let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c']; +pull(myArray1, 'a', 'c'); +console.log(myArray1) -> [ 'b', 'b' ] + +let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c']; +pull(myArray2, ['a', 'c']); +console.log(myArray2) -> [ 'b', 'b' ] ``` From 39164e9cbf68fc32775afa9c6c3f40f318f62cbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 14:38:49 +0100 Subject: [PATCH 21/36] update snippets 96-107 --- snippets/RGBToHex.md | 5 ++++- snippets/pullAtIndex.md | 20 +++++++++++--------- snippets/pullAtValue.md | 13 +++++++------ snippets/randomHexColor.md | 11 +++++++---- snippets/randomIntegerInRange.md | 5 ++++- snippets/randomNumberInRange.md | 5 ++++- snippets/readFileLines.md | 23 +++++++++++++---------- snippets/redirect.md | 5 ++++- snippets/remove.md | 5 ++++- snippets/repeatString.md | 13 ++++++++----- snippets/reverseString.md | 5 ++++- 11 files changed, 70 insertions(+), 40 deletions(-) diff --git a/snippets/RGBToHex.md b/snippets/RGBToHex.md index eb13cbeb4..f7568f70f 100644 --- a/snippets/RGBToHex.md +++ b/snippets/RGBToHex.md @@ -6,5 +6,8 @@ Convert given RGB parameters to hexadecimal string using bitwise left-shift oper ```js const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0'); -// RGBToHex(255, 165, 1) -> 'ffa501' +``` + +```js +RGBToHex(255, 165, 1) -> 'ffa501' ``` diff --git a/snippets/pullAtIndex.md b/snippets/pullAtIndex.md index e848cc7c7..459c2c7b2 100644 --- a/snippets/pullAtIndex.md +++ b/snippets/pullAtIndex.md @@ -4,21 +4,23 @@ Mutates the original array to filter out the values at the specified indexes. Use `Array.filter()` and `Array.includes()` to pull out the values that are not needed. Use `Array.length = 0` to mutate the passed in an array by resetting it's length to zero and `Array.push()` to re-populate it with only the pulled values. -Use `Array.push()` to keep track of pulled values +Use `Array.push()` to keep track of pulled values ```js const pullAtIndex = (arr, pullArr) => { let removed = []; let pulled = arr.map((v, i) => pullArr.includes(i) ? removed.push(v) : v) - .filter((v, i) => !pullArr.includes(i)); + .filter((v, i) => !pullArr.includes(i)) arr.length = 0; pulled.forEach(v => arr.push(v)); return removed; -}; - -// let myArray = ['a', 'b', 'c', 'd']; -// let pulled = pullAtIndex(myArray, [1, 3]); - -// console.log(myArray); -> [ 'a', 'c' ] -// console.log(pulled); -> [ 'b', 'd' ] +} +``` + +```js +let myArray = ['a', 'b', 'c', 'd']; +let pulled = pullAtIndex(myArray, [1, 3]); + +console.log(myArray); // [ 'a', 'c' ] +console.log(pulled); // [ 'b', 'd' ] ``` diff --git a/snippets/pullAtValue.md b/snippets/pullAtValue.md index c092933e4..ff2559a53 100644 --- a/snippets/pullAtValue.md +++ b/snippets/pullAtValue.md @@ -4,7 +4,7 @@ Mutates the original array to filter out the values specified. Returns the remov Use `Array.filter()` and `Array.includes()` to pull out the values that are not needed. Use `Array.length = 0` to mutate the passed in an array by resetting it's length to zero and `Array.push()` to re-populate it with only the pulled values. -Use `Array.push()` to keep track of pulled values +Use `Array.push()` to keep track of pulled values ```js const pullAtValue = (arr, pullArr) => { @@ -14,11 +14,12 @@ const pullAtValue = (arr, pullArr) => { arr.length = 0; mutateTo.forEach(v => arr.push(v)); return removed; -}; -/* +} +``` + +```js let myArray = ['a', 'b', 'c', 'd']; let pulled = pullAtValue(myArray, ['b', 'd']); -console.log(myArray); -> [ 'a', 'c' ] -console.log(pulled); -> [ 'b', 'd' ] -*/ +console.log(myArray); // [ 'a', 'c' ] +console.log(pulled); // [ 'b', 'd' ] ``` diff --git a/snippets/randomHexColor.md b/snippets/randomHexColor.md index f7cdbc26e..b511c10d7 100644 --- a/snippets/randomHexColor.md +++ b/snippets/randomHexColor.md @@ -2,7 +2,7 @@ Generates a random hexadecimal color code. -Use `Math.random` to generate a random 24-bit(6x4bits) hexadecimal number. Use bit shifting and then convert it to an hexadecimal String using `toString(16)`. +Use `Math.random` to generate a random 24-bit(6x4bits) hexadecimal number. Use bit shifting and then convert it to an hexadecimal String using `toString(16)`. ```js const randomHexColor = () => { @@ -10,7 +10,10 @@ const randomHexColor = () => { return '#' + (n.length !== 6 ? (Math.random() * 0xf | 0).toString(16) + n : n); }; -// randomHexColorCode() -> "#e34155" -// randomHexColorCode() -> "#fd73a6" -// randomHexColorCode() -> "#4144c6" +``` + +```js +randomHexColorCode() // "#e34155" +randomHexColorCode() // "#fd73a6" +randomHexColorCode() // "#4144c6" ``` diff --git a/snippets/randomIntegerInRange.md b/snippets/randomIntegerInRange.md index 2d35fd279..e8fd26077 100644 --- a/snippets/randomIntegerInRange.md +++ b/snippets/randomIntegerInRange.md @@ -6,5 +6,8 @@ Use `Math.random()` to generate a random number and map it to the desired range, ```js const randomIntegerInRange = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; -// randomIntegerInRange(0, 5) -> 2 +``` + +```js +randomIntegerInRange(0, 5) -> 2 ``` diff --git a/snippets/randomNumberInRange.md b/snippets/randomNumberInRange.md index a92dfff54..53d60b16d 100644 --- a/snippets/randomNumberInRange.md +++ b/snippets/randomNumberInRange.md @@ -6,5 +6,8 @@ Use `Math.random()` to generate a random value, map it to the desired range usin ```js const randomNumberInRange = (min, max) => Math.random() * (max - min) + min; -// randomNumberInRange(2,10) -> 6.0211363285087005 +``` + +```js +randomNumberInRange(2,10) -> 6.0211363285087005 ``` diff --git a/snippets/readFileLines.md b/snippets/readFileLines.md index 17cb4788f..2492195c0 100644 --- a/snippets/readFileLines.md +++ b/snippets/readFileLines.md @@ -8,14 +8,17 @@ creating an array from contents of file by `split`ing file content line by line ```js const fs = require('fs'); -const readFileLines = filename => fs.readFileSync(filename).toString('UTF8').split(/\r?\n/); -/* - contents of test.txt : - line1 - line2 - line3 - ___________________________ - let arr = readFileLines('test.txt') - console.log(arr) // -> ['line1', 'line2', 'line3'] - */ +const readFileLines = filename => fs.readFileSync(filename).toString('UTF8').split('\n'); +``` + +```js +/* +contents of test.txt : + line1 + line2 + line3 + ___________________________ +*/ +let arr = readFileLines('test.txt') +console.log(arr) // ['line1', 'line2', 'line3'] ``` diff --git a/snippets/redirect.md b/snippets/redirect.md index d98e2caf2..006d5acd0 100644 --- a/snippets/redirect.md +++ b/snippets/redirect.md @@ -8,5 +8,8 @@ Pass a second argument to simulate a link click (`true` - default) or an HTTP re ```js const redirect = (url, asLink = true) => asLink ? window.location.href = url : window.location.replace(url); -// redirect('https://google.com') +``` + +```js +redirect('https://google.com') ``` diff --git a/snippets/remove.md b/snippets/remove.md index 25606c21b..cfbcba598 100644 --- a/snippets/remove.md +++ b/snippets/remove.md @@ -11,5 +11,8 @@ const remove = (arr, func) => arr.splice(arr.indexOf(val), 1); return acc.concat(val); }, []) : []; -// remove([1, 2, 3, 4], n => n % 2 == 0) -> [2, 4] +``` + +```js +remove([1, 2, 3, 4], n => n % 2 == 0) -> [2, 4] ``` diff --git a/snippets/repeatString.md b/snippets/repeatString.md index c7478acb2..2f66bb047 100644 --- a/snippets/repeatString.md +++ b/snippets/repeatString.md @@ -5,9 +5,12 @@ Repeats a string n times using `String.repeat()` If no string is provided the default is `""` and the default number of times is 2. ```js -const repeatString = (str = '', num = 2) => { - return num >= 0 ? str.repeat(num) : str; -}; -// repeatString("abc",3) -> 'abcabcabc' -// repeatString("abc") -> 'abcabc' +const repeatString = (str="",num=2) => { + return num >= 0 ? str.repeat(num) : str; +} +``` + +```js +repeatString("abc",3) // 'abcabcabc' +repeatString("abc") // 'abcabc' ``` diff --git a/snippets/reverseString.md b/snippets/reverseString.md index 5564a5897..2fe9cdd0b 100644 --- a/snippets/reverseString.md +++ b/snippets/reverseString.md @@ -7,5 +7,8 @@ Combine characters to get a string using `join('')`. ```js const reverseString = str => str.split('').reverse().join(''); -// reverseString('foobar') -> 'raboof' +``` + +```js +reverseString('foobar') -> 'raboof' ``` From e7e687f60c99d4f862c5641d2b97e833460a5de5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 14:49:52 +0100 Subject: [PATCH 22/36] update snippets 0-All --- snippets/UUIDGenerator.md | 5 ++++- snippets/round.md | 7 +++++-- snippets/runPromisesInSeries.md | 7 +++++-- snippets/sample.md | 5 ++++- snippets/scrollToTop.md | 5 ++++- snippets/select.md | 8 +++++--- snippets/shallowClone.md | 5 +++-- snippets/shuffle.md | 9 ++++++--- snippets/similarity.md | 5 ++++- snippets/sleep.md | 5 +++-- snippets/sortCharactersInString.md | 5 ++++- snippets/speechSynthesis.md | 5 ++++- snippets/spreadOver.md | 11 ++++++----- snippets/standardDeviation.md | 7 +++++-- snippets/symmetricDifference.md | 7 +++++-- snippets/tail.md | 7 +++++-- snippets/take.md | 7 +++++-- snippets/takeRight.md | 7 +++++-- snippets/timeTaken.md | 7 +++++-- snippets/toCamelCase.md | 15 +++++++++------ snippets/toDecimalMark.md | 7 +++++-- snippets/toEnglishDate.md | 5 ++++- snippets/toKebabCase.md | 13 ++++++++----- snippets/toOrdinalSuffix.md | 5 ++++- snippets/toSnakeCase.md | 15 +++++++++------ snippets/truncateString.md | 5 ++++- snippets/truthCheckCollection.md | 7 +++++-- snippets/union.md | 5 ++++- snippets/validateNumber.md | 5 ++++- snippets/without.md | 5 ++++- snippets/words.md | 7 +++++-- snippets/zip.md | 13 ++++++++----- snippets/zipObject.md | 9 ++++++--- 33 files changed, 166 insertions(+), 74 deletions(-) diff --git a/snippets/UUIDGenerator.md b/snippets/UUIDGenerator.md index 316659ea2..87300e5ed 100644 --- a/snippets/UUIDGenerator.md +++ b/snippets/UUIDGenerator.md @@ -9,5 +9,8 @@ const UUIDGenerator = () => ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) ); -// UUIDGenerator() -> '7982fcfe-5721-4632-bede-6000885be57d' +``` + +```js +UUIDGenerator() -> '7982fcfe-5721-4632-bede-6000885be57d' ``` diff --git a/snippets/round.md b/snippets/round.md index 81e90dfe0..8ece6dcd1 100644 --- a/snippets/round.md +++ b/snippets/round.md @@ -6,6 +6,9 @@ Use `Math.round()` and template literals to round the number to the specified nu Omit the second argument, `decimals` to round to an integer. ```js -const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`); -// round(1.005, 2) -> 1.01 +const round = (n, decimals=0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`); +``` + +```js +round(1.005, 2) // 1.01 ``` diff --git a/snippets/runPromisesInSeries.md b/snippets/runPromisesInSeries.md index c1cedb147..9719ed6aa 100644 --- a/snippets/runPromisesInSeries.md +++ b/snippets/runPromisesInSeries.md @@ -6,6 +6,9 @@ Use `Array.reduce()` to create a promise chain, where each promise returns the n ```js const runPromisesInSeries = ps => ps.reduce((p, next) => p.then(next), Promise.resolve()); -// const delay = (d) => new Promise(r => setTimeout(r, d)) -// runPromisesInSeries([() => delay(1000), () => delay(2000)]) -> executes each promise sequentially, taking a total of 3 seconds to complete +``` + +```js +const delay = (d) => new Promise(r => setTimeout(r, d)) +runPromisesInSeries([() => delay(1000), () => delay(2000)]) -> //executes each promise sequentially, taking a total of 3 seconds to complete ``` diff --git a/snippets/sample.md b/snippets/sample.md index caf1941e3..078542224 100644 --- a/snippets/sample.md +++ b/snippets/sample.md @@ -7,5 +7,8 @@ This method also works with strings. ```js const sample = arr => arr[Math.floor(Math.random() * arr.length)]; -// sample([3, 7, 9, 11]) -> 9 +``` + +```js +sample([3, 7, 9, 11]) -> 9 ``` diff --git a/snippets/scrollToTop.md b/snippets/scrollToTop.md index 62cad2588..90c0342a8 100644 --- a/snippets/scrollToTop.md +++ b/snippets/scrollToTop.md @@ -13,5 +13,8 @@ const scrollToTop = () => { window.scrollTo(0, c - c / 8); } }; -// scrollToTop() +``` + +```js +scrollToTop() ``` diff --git a/snippets/select.md b/snippets/select.md index ee243bb8e..c3db1e047 100644 --- a/snippets/select.md +++ b/snippets/select.md @@ -7,7 +7,9 @@ If the property does not exists returns `undefined`. ```js const select = (from, selector) => selector.split('.').reduce((prev, cur) => prev && prev[cur], from); - -// const obj = {selector: {to: {val: 'val to select'}}}; -// select(obj, 'selector.to.val'); -> 'val to select' +``` + +```js +const obj = {selector: {to: {val: 'val to select'}}}; +select(obj, 'selector.to.val'); -> 'val to select' ``` diff --git a/snippets/shallowClone.md b/snippets/shallowClone.md index 0a6c25d82..cdef28d9b 100644 --- a/snippets/shallowClone.md +++ b/snippets/shallowClone.md @@ -6,9 +6,10 @@ Use `Object.assign()` and an empty object (`{}`) to create a shallow clone of th ```js const shallowClone = obj => Object.assign({}, obj); -/* +``` + +```js const a = { x: true, y: 1 }; const b = shallowClone(a); a === b -> false -*/ ``` diff --git a/snippets/shuffle.md b/snippets/shuffle.md index fa576b016..4e7f88879 100644 --- a/snippets/shuffle.md +++ b/snippets/shuffle.md @@ -13,7 +13,10 @@ const shuffle = ([...arr]) => { } return arr; }; -// const foo = [1,2,3] -// shuffle(foo) -> [2,3,1] -// console.log(foo) -> [1,2,3] +``` + +```js +const foo = [1,2,3] +shuffle(foo) // [2,3,1] +console.log(foo) // [1,2,3] ``` diff --git a/snippets/similarity.md b/snippets/similarity.md index 1a2cc7ccb..e1f735be2 100644 --- a/snippets/similarity.md +++ b/snippets/similarity.md @@ -6,5 +6,8 @@ Use `filter()` to remove values that are not part of `values`, determined using ```js const similarity = (arr, values) => arr.filter(v => values.includes(v)); -// similarity([1,2,3], [1,2,4]) -> [1,2] +``` + +```js +similarity([1,2,3], [1,2,4]) -> [1,2] ``` diff --git a/snippets/sleep.md b/snippets/sleep.md index 66a45d2ff..69fd73059 100644 --- a/snippets/sleep.md +++ b/snippets/sleep.md @@ -6,11 +6,12 @@ Delay executing part of an `async` function, by putting it to sleep, returning a ```js const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); -/* +``` + +```js async function sleepyWork() { console.log('I\'m going to sleep for 1 second.'); await sleep(1000); console.log('I woke up after 1 second.'); } -*/ ``` diff --git a/snippets/sortCharactersInString.md b/snippets/sortCharactersInString.md index 79c7acc0f..4e7e68cf7 100644 --- a/snippets/sortCharactersInString.md +++ b/snippets/sortCharactersInString.md @@ -7,5 +7,8 @@ Split the string using `split('')`, `Array.sort()` utilizing `localeCompare()`, ```js const sortCharactersInString = str => str.split('').sort((a, b) => a.localeCompare(b)).join(''); -// sortCharactersInString('cabbage') -> 'aabbceg' +``` + +```js +sortCharactersInString('cabbage') -> 'aabbceg' ``` diff --git a/snippets/speechSynthesis.md b/snippets/speechSynthesis.md index cb8d150f4..2ccb55375 100644 --- a/snippets/speechSynthesis.md +++ b/snippets/speechSynthesis.md @@ -13,5 +13,8 @@ const speechSynthesis = message => { msg.voice = window.speechSynthesis.getVoices()[0]; window.speechSynthesis.speak(msg); }; -// speechSynthesis('Hello, World') -> plays the message +``` + +```js +speechSynthesis('Hello, World') -> // plays the message ``` diff --git a/snippets/spreadOver.md b/snippets/spreadOver.md index aff6281a6..d41b1cb36 100644 --- a/snippets/spreadOver.md +++ b/snippets/spreadOver.md @@ -6,9 +6,10 @@ Use closures and the spread operator (`...`) to map the array of arguments to th ```js const spreadOver = fn => argsArr => fn(...argsArr); -/* +``` + +```js const arrayMax = spreadOver(Math.max) -arrayMax([1,2,3]) // -> 3 -arrayMax([1,2,4]) // -> 4 -*/ -``` +arrayMax([1,2,3]) -> 3 +arrayMax([1,2,4]) -> 4 +``` diff --git a/snippets/standardDeviation.md b/snippets/standardDeviation.md index 51cf4a0dd..43d7139fd 100644 --- a/snippets/standardDeviation.md +++ b/snippets/standardDeviation.md @@ -14,6 +14,9 @@ const standardDeviation = (arr, usePopulation = false) => { .reduce((acc, val) => acc + val, 0) / (arr.length - (usePopulation ? 0 : 1)) ); }; -// standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample) -// standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population) +``` + +```js +standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample) +standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population) ``` diff --git a/snippets/symmetricDifference.md b/snippets/symmetricDifference.md index 596adf28a..6879edb39 100644 --- a/snippets/symmetricDifference.md +++ b/snippets/symmetricDifference.md @@ -8,6 +8,9 @@ Create a `Set` from each array, then use `Array.filter()` on each of them to onl const symmetricDifference = (a, b) => { const sA = new Set(a), sB = new Set(b); return [...a.filter(x => !sB.has(x)), ...b.filter(x => !sA.has(x))]; -}; -// symmetricDifference([1,2,3], [1,2,4]) -> [3,4] +} +``` + +```js +symmetricDifference([1,2,3], [1,2,4]) -> [3,4] ``` diff --git a/snippets/tail.md b/snippets/tail.md index 9d84a17f1..69983d169 100644 --- a/snippets/tail.md +++ b/snippets/tail.md @@ -6,6 +6,9 @@ Return `arr.slice(1)` if the array's `length` is more than `1`, otherwise, retur ```js const tail = arr => arr.length > 1 ? arr.slice(1) : arr; -// tail([1,2,3]) -> [2,3] -// tail([1]) -> [1] +``` + +```js +tail([1,2,3]) -> [2,3] +tail([1]) -> [1] ``` diff --git a/snippets/take.md b/snippets/take.md index f6afa5dab..07d25262d 100644 --- a/snippets/take.md +++ b/snippets/take.md @@ -6,6 +6,9 @@ Use `Array.slice()` to create a slice of the array with `n` elements taken from ```js const take = (arr, n = 1) => arr.slice(0, n); -// take([1, 2, 3], 5) -> [1, 2, 3] -// take([1, 2, 3], 0) -> [] +``` + +```js +take([1, 2, 3], 5) -> [1, 2, 3] +take([1, 2, 3], 0) -> [] ``` diff --git a/snippets/takeRight.md b/snippets/takeRight.md index a8fc0e114..45d272ed0 100644 --- a/snippets/takeRight.md +++ b/snippets/takeRight.md @@ -6,6 +6,9 @@ Use `Array.slice()` to create a slice of the array with `n` elements taken from ```js const takeRight = (arr, n = 1) => arr.slice(arr.length - n, arr.length); -// takeRight([1, 2, 3], 2) -> [ 2, 3 ] -// takeRight([1, 2, 3]) -> [3] +``` + +```js +takeRight([1, 2, 3], 2) -> [ 2, 3 ] +takeRight([1, 2, 3]) -> [3] ``` diff --git a/snippets/timeTaken.md b/snippets/timeTaken.md index 05b16fb46..b75402b9b 100644 --- a/snippets/timeTaken.md +++ b/snippets/timeTaken.md @@ -9,6 +9,9 @@ const timeTaken = callback => { console.time('timeTaken'); const r = callback(); console.timeEnd('timeTaken'); return r; }; -// timeTaken(() => Math.pow(2, 10)) -> 1024 -// (logged): timeTaken: 0.02099609375ms +``` + +```js +timeTaken(() => Math.pow(2, 10)) -> 1024 +(logged): timeTaken: 0.02099609375ms ``` diff --git a/snippets/toCamelCase.md b/snippets/toCamelCase.md index c3c78e8e9..366a988dd 100644 --- a/snippets/toCamelCase.md +++ b/snippets/toCamelCase.md @@ -10,10 +10,13 @@ const toCamelCase = str => { let s = str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) .map(x => x.slice(0, 1).toUpperCase() + x.slice(1).toLowerCase()) .join(''); - return s.slice(0, 1).toLowerCase() + s.slice(1); -}; -// toCamelCase("some_database_field_name") -> 'someDatabaseFieldName' -// toCamelCase("Some label that needs to be camelized") -> 'someLabelThatNeedsToBeCamelized' -// toCamelCase("some-javascript-property") -> 'someJavascriptProperty' -// toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") -> 'someMixedStringWithSpacesUnderscoresAndHyphens' + return s.slice(0,1).toLowerCase() + s.slice(1) + } +``` + +```js +toCamelCase("some_database_field_name") -> 'someDatabaseFieldName' +toCamelCase("Some label that needs to be camelized") -> 'someLabelThatNeedsToBeCamelized' +toCamelCase("some-javascript-property") -> 'someJavascriptProperty' +toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") -> 'someMixedStringWithSpacesUnderscoresAndHyphens' ``` diff --git a/snippets/toDecimalMark.md b/snippets/toDecimalMark.md index b05429817..b670622cd 100644 --- a/snippets/toDecimalMark.md +++ b/snippets/toDecimalMark.md @@ -3,6 +3,9 @@ Use `toLocaleString()` to convert a float-point arithmetic to the [Decimal mark](https://en.wikipedia.org/wiki/Decimal_mark) form. It makes a comma separated string from a number. ```js -const toDecimalMark = num => num.toLocaleString('en-US'); -// toDecimalMark(12305030388.9087) -> "12,305,030,388.9087" +const toDecimalMark = num => num.toLocaleString("en-US"); +``` + +```js +toDecimalMark(12305030388.9087) // "12,305,030,388.9087" ``` diff --git a/snippets/toEnglishDate.md b/snippets/toEnglishDate.md index ffbcf6cd7..30a4c1f2c 100644 --- a/snippets/toEnglishDate.md +++ b/snippets/toEnglishDate.md @@ -7,5 +7,8 @@ Throws an error if the passed time cannot be converted to a date. ```js const toEnglishDate = (time) => { try { return new Date(time).toISOString().split('T')[0].replace(/-/g, '/'); } catch (e) {} }; -// toEnglishDate('09/21/2010') -> '21/09/2010' +``` + +```js +toEnglishDate('09/21/2010') // '21/09/2010' ``` diff --git a/snippets/toKebabCase.md b/snippets/toKebabCase.md index 20c7e2546..50b7ead16 100644 --- a/snippets/toKebabCase.md +++ b/snippets/toKebabCase.md @@ -10,9 +10,12 @@ const toKebabCase = str => str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) .map(x => x.toLowerCase()) .join('-'); -// toKebabCase("camelCase") -> 'camel-case' -// toKebabCase("some text") -> 'some-text' -// toKebabCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some-mixed-string-with-spaces-underscores-and-hyphens' -// toKebabCase("AllThe-small Things") -> "all-the-small-things" -// toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-xml-and-html" +``` + +```js +toKebabCase("camelCase") -> 'camel-case' +toKebabCase("some text") -> 'some-text' +toKebabCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some-mixed-string-with-spaces-underscores-and-hyphens' +toKebabCase("AllThe-small Things") -> "all-the-small-things" +toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-xml-and-html" ``` diff --git a/snippets/toOrdinalSuffix.md b/snippets/toOrdinalSuffix.md index 482286056..53541c162 100644 --- a/snippets/toOrdinalSuffix.md +++ b/snippets/toOrdinalSuffix.md @@ -13,5 +13,8 @@ const toOrdinalSuffix = num => { tPattern = [11, 12, 13, 14, 15, 16, 17, 18, 19]; return oPattern.includes(digits[0]) && !tPattern.includes(digits[1]) ? int + ordinals[digits[0] - 1] : int + ordinals[3]; }; -// toOrdinalSuffix("123") -> "123rd" +``` + +```js +toOrdinalSuffix("123") -> "123rd" ``` diff --git a/snippets/toSnakeCase.md b/snippets/toSnakeCase.md index b4022f98d..72ed59aa4 100644 --- a/snippets/toSnakeCase.md +++ b/snippets/toSnakeCase.md @@ -11,10 +11,13 @@ const toSnakeCase = str => { .map(x => x.toLowerCase()) .join('_'); }; -// toSnakeCase("camelCase") -> 'camel_case' -// toSnakeCase("some text") -> 'some_text' -// toSnakeCase("some-javascript-property") -> 'some_javascript_property' -// toSnakeCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some_mixed_string_with_spaces_underscores_and_hyphens' -// toSnakeCase("AllThe-small Things") -> "all_the_small_things" -// toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html" +``` + +```js +toSnakeCase("camelCase") -> 'camel_case' +toSnakeCase("some text") -> 'some_text' +toSnakeCase("some-javascript-property") -> 'some_javascript_property' +toSnakeCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some_mixed_string_with_spaces_underscores_and_hyphens' +toSnakeCase("AllThe-small Things") -> "all_the_smal_things" +toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html" ``` diff --git a/snippets/truncateString.md b/snippets/truncateString.md index 48924b0ae..56561cc7f 100644 --- a/snippets/truncateString.md +++ b/snippets/truncateString.md @@ -8,5 +8,8 @@ Return the string truncated to the desired length, with `...` appended to the en ```js const truncateString = (str, num) => str.length > num ? str.slice(0, num > 3 ? num - 3 : num) + '...' : str; -// truncateString('boomerang', 7) -> 'boom...' +``` + +```js +truncateString('boomerang', 7) -> 'boom...' ``` diff --git a/snippets/truthCheckCollection.md b/snippets/truthCheckCollection.md index 3c592d308..a2c4cb35e 100644 --- a/snippets/truthCheckCollection.md +++ b/snippets/truthCheckCollection.md @@ -3,8 +3,11 @@ Checks if the predicate (second argument) is truthy on all elements of a collection (first argument). Use `Array.every()` to check if each passed object has the specified property and if it returns a truthy value. - + ```js const truthCheckCollection = (collection, pre) => (collection.every(obj => obj[pre])); -// truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") -> true +``` + +```js +truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") -> true ``` diff --git a/snippets/union.md b/snippets/union.md index 27427a9aa..d141d2a3e 100644 --- a/snippets/union.md +++ b/snippets/union.md @@ -6,5 +6,8 @@ Create a `Set` with all values of `a` and `b` and convert to an array. ```js const union = (a, b) => Array.from(new Set([...a, ...b])); -// union([1,2,3], [4,3,2]) -> [1,2,3,4] +``` + +```js +union([1,2,3], [4,3,2]) -> [1,2,3,4] ``` diff --git a/snippets/validateNumber.md b/snippets/validateNumber.md index 8874cfce2..075e6b4f9 100644 --- a/snippets/validateNumber.md +++ b/snippets/validateNumber.md @@ -8,5 +8,8 @@ Use `Number()` to check if the coercion holds. ```js const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n; -// validateNumber('10') -> true +``` + +```js +validateNumber('10') -> true ``` diff --git a/snippets/without.md b/snippets/without.md index 532ec26d9..044f2e8f6 100644 --- a/snippets/without.md +++ b/snippets/without.md @@ -8,5 +8,8 @@ _(For a snippet that mutates the original array see [`pull`](#pull))_ ```js const without = (arr, ...args) => arr.filter(v => !args.includes(v)); -// without([2, 1, 2, 3], 1, 2) -> [3] +``` + +```js +without([2, 1, 2, 3], 1, 2) -> [3] ``` diff --git a/snippets/words.md b/snippets/words.md index df6b258b7..47d70659d 100644 --- a/snippets/words.md +++ b/snippets/words.md @@ -7,6 +7,9 @@ Omit the second argument to use the default regex. ```js const words = (str, pattern = /[^a-zA-Z-]+/) => str.split(pattern).filter(Boolean); -// words("I love javaScript!!") -> ["I", "love", "javaScript"] -// words("python, javaScript & coffee") -> ["python", "javaScript", "coffee"] +``` + +```js +words("I love javaScript!!") -> ["I", "love", "javaScript"] +words("python, javaScript & coffee") -> ["python", "javaScript", "coffee"] ``` diff --git a/snippets/zip.md b/snippets/zip.md index 981143fd5..92613ff34 100644 --- a/snippets/zip.md +++ b/snippets/zip.md @@ -10,9 +10,12 @@ If lengths of the argument-arrays vary, `undefined` is used where no value could const zip = (...arrays) => { const maxLength = Math.max(...arrays.map(x => x.length)); return Array.from({length: maxLength}).map((_, i) => { - return Array.from({length: arrays.length}, (_, k) => arrays[k][i]); - }); -}; -// zip(['a', 'b'], [1, 2], [true, false]); -> [['a', 1, true], ['b', 2, false]] -// zip(['a'], [1, 2], [true, false]); -> [['a', 1, true], [undefined, 2, false]] + return Array.from({length: arrays.length}, (_, k) => arrays[k][i]); + }) +} +``` + +```js +zip(['a', 'b'], [1, 2], [true, false]); // [['a', 1, true], ['b', 2, false]] +zip(['a'], [1, 2], [true, false]); // [['a', 1, true], [undefined, 2, false]] ``` diff --git a/snippets/zipObject.md b/snippets/zipObject.md index be9172542..99d134ac8 100644 --- a/snippets/zipObject.md +++ b/snippets/zipObject.md @@ -5,7 +5,10 @@ Given an array of valid property identifiers and an array of values, return an o Since an object can have undefined values but not undefined property pointers, the array of properties is used to decide the structure of the resulting object using `Array.reduce()`. ```js -const zipObject = (props, values) => props.reduce((obj, prop, index) => (obj[prop] = values[index], obj), {}); -// zipObject(['a','b','c'], [1,2]) -> {a: 1, b: 2, c: undefined} -// zipObject(['a','b'], [1,2,3]) -> {a: 1, b: 2} +const zipObject = ( props, values ) => props.reduce( ( obj, prop, index ) => ( obj[prop] = values[index], obj ), {} ) +``` + +```js +zipObject(['a','b','c'], [1,2]) // {a: 1, b: 2, c: undefined} +zipObject(['a','b'], [1,2,3]) // {a: 1, b: 2} ``` From 0219b6bc68a226faec4675c1f38ebd75dd5d6d38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Feje=C5=A1?= Date: Mon, 25 Dec 2017 14:51:48 +0100 Subject: [PATCH 23/36] builder --- README.md | 1029 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 699 insertions(+), 330 deletions(-) diff --git a/README.md b/README.md index a29b99093..3269733e7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![Logo](/logo.png) -# 30 seconds of code +# 30 seconds of code [![License](https://img.shields.io/badge/license-CC0--1.0-blue.svg)](https://github.com/Chalarangelo/30-seconds-of-code/blob/master/LICENSE) [![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/30-seconds-of-code/Lobby) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![Travis Build](https://travis-ci.org/Chalarangelo/30-seconds-of-code.svg?branch=master)](https://travis-ci.org/Chalarangelo/30-seconds-of-code) [![Insight.io](https://img.shields.io/badge/insight.io-Ready-brightgreen.svg)](https://insight.io/github.com/Chalarangelo/30-seconds-of-code/tree/master/?source=0) [![js-semistandard-style](https://img.shields.io/badge/code%20style-semistandard-brightgreen.svg?style=flat-square)](https://github.com/Flet/semistandard) > Curated collection of useful Javascript snippets that you can understand in 30 seconds or less. @@ -186,13 +186,14 @@ Given a key and a set of arguments, call them when given a context. Primarily us Use a closure to call a stored key with stored arguments. ```js -const call = (key, ...args) => context => context[ key ](...args); -/* +const call = ( key, ...args ) => context => context[ key ]( ...args ); +``` + +```js Promise.resolve( [ 1, 2, 3 ] ).then( call('map', x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ] const map = call.bind(null, 'map') Promise.resolve( [ 1, 2, 3 ] ).then( map( x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ] -*/ -``` +``` [⬆ back to top](#table-of-contents) @@ -203,15 +204,16 @@ Changes a function that accepts an array into a variadic function. Given a function, return a closure that collects all inputs into an array-accepting function. ```js -const collectInto = fn => (...args) => fn(args); -/* +const collectInto = fn => ( ...args ) => fn( args ); +``` + +```js const Pall = collectInto( Promise.all.bind(Promise) ) let p1 = Promise.resolve(1) let p2 = Promise.resolve(2) let p3 = new Promise((resolve) => setTimeout(resolve,2000,3)) Pall(p1, p2, p3).then(console.log) -*/ -``` +``` [⬆ back to top](#table-of-contents) @@ -222,8 +224,10 @@ Flip takes a function as an argument, then makes the first argument the last Return a closure that takes variadic inputs, and splices the last argument to make it the first argument before applying the rest. ```js -const flip = fn => (...args) => fn(args.pop(), ...args); -/* +const flip = fn => (...args) => fn(args.pop(), ...args) +``` + +```js let a = {name: 'John Smith'} let b = {} const mergeFrom = flip(Object.assign) @@ -231,27 +235,7 @@ let mergePerson = mergeFrom.bind(null, a) mergePerson(b) // == b b = {} Object.assign(b, a) // == b -*/ -``` - -[⬆ back to top](#table-of-contents) - -### pipeFunctions - -Performs left-to-right function composition. - -Use `Array.reduce()` with the spread operator (`...`) to perform left-to-right function composition. -The first (leftmost) function can accept one or more arguments; the remaining functions must be unary. - -```js -const pipeFunctions = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args))); -/* -const add5 = x => x + 5 -const multiply = (x, y) => x * y -const multiplyAndAdd5 = pipeFunctions(multiply, add5) -multiplyAndAdd5(5, 2) -> 15 -*/ -``` +``` [⬆ back to top](#table-of-contents) @@ -271,8 +255,11 @@ const promisify = func => func(...args, (err, result) => err ? reject(err) : resolve(result)) ); -// const delay = promisify((d, cb) => setTimeout(cb, d)) -// delay(2000).then(() => console.log('Hi!')) -> Promise resolves after 2s +``` + +```js +const delay = promisify((d, cb) => setTimeout(cb, d)) +delay(2000).then(() => console.log('Hi!')) -> // Promise resolves after 2s ``` [⬆ back to top](#table-of-contents) @@ -285,12 +272,13 @@ Use closures and the spread operator (`...`) to map the array of arguments to th ```js const spreadOver = fn => argsArr => fn(...argsArr); -/* +``` + +```js const arrayMax = spreadOver(Math.max) -arrayMax([1,2,3]) // -> 3 -arrayMax([1,2,4]) // -> 4 -*/ -``` +arrayMax([1,2,3]) -> 3 +arrayMax([1,2,4]) -> 4 +``` [⬆ back to top](#table-of-contents) ## Array @@ -304,10 +292,13 @@ Use `Array.reduce()` and the `gcd` formula (uses recursion) to calculate the gre ```js const arrayGcd = arr => { const gcd = (x, y) => !y ? x : gcd(y, x % y); - return arr.reduce((a, b) => gcd(a, b)); -}; -// arrayGcd([1,2,3,4,5]) -> 1 -// arrayGcd([4,8,12]) -> 4 + return arr.reduce((a,b) => gcd(a,b)); +} +``` + +```js +arrayGcd([1,2,3,4,5]) -> 1 +arrayGcd([4,8,12]) -> 4 ``` [⬆ back to top](#table-of-contents) @@ -321,11 +312,14 @@ Use `Array.reduce()` and the `lcm` formula (uses recursion) to calculate the low ```js const arrayLcm = arr => { const gcd = (x, y) => !y ? x : gcd(y, x % y); - const lcm = (x, y) => (x * y) / gcd(x, y); - return arr.reduce((a, b) => lcm(a, b)); -}; -// arrayLcm([1,2,3,4,5]) -> 60 -// arrayLcm([4,8,12]) -> 24 + const lcm = (x, y) => (x*y)/gcd(x, y); + return arr.reduce((a,b) => lcm(a,b)); +} +``` + +```js +arrayLcm([1,2,3,4,5]) -> 60 +arrayLcm([4,8,12]) -> 24 ``` [⬆ back to top](#table-of-contents) @@ -338,7 +332,10 @@ Use `Math.max()` combined with the spread operator (`...`) to get the maximum va ```js const arrayMax = arr => Math.max(...arr); -// arrayMax([10, 1, 5]) -> 10 +``` + +```js +arrayMax([10, 1, 5]) -> 10 ``` [⬆ back to top](#table-of-contents) @@ -351,7 +348,10 @@ Use `Math.min()` combined with the spread operator (`...`) to get the minimum va ```js const arrayMin = arr => Math.min(...arr); -// arrayMin([10, 1, 5]) -> 1 +``` + +```js +arrayMin([10, 1, 5]) -> 1 ``` [⬆ back to top](#table-of-contents) @@ -367,7 +367,10 @@ If the original array can't be split evenly, the final chunk will contain the re ```js const chunk = (arr, size) => Array.from({length: Math.ceil(arr.length / size)}, (v, i) => arr.slice(i * size, i * size + size)); -// chunk([1,2,3,4,5], 2) -> [[1,2],[3,4],[5]] +``` + +```js +chunk([1,2,3,4,5], 2) -> [[1,2],[3,4],[5]] ``` [⬆ back to top](#table-of-contents) @@ -380,7 +383,10 @@ Use `Array.filter()` to filter out falsey values (`false`, `null`, `0`, `""`, `u ```js const compact = arr => arr.filter(Boolean); -// compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) -> [ 1, 2, 3, 'a', 's', 34 ] +``` + +```js +compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) -> [ 1, 2, 3, 'a', 's', 34 ] ``` [⬆ back to top](#table-of-contents) @@ -393,7 +399,10 @@ Use `Array.reduce()` to increment a counter each time you encounter the specific ```js const countOccurrences = (arr, value) => arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0); -// countOccurrences([1,1,2,1,2,3], 1) -> 3 +``` + +```js +countOccurrences([1,1,2,1,2,3], 1) -> 3 ``` [⬆ back to top](#table-of-contents) @@ -408,7 +417,10 @@ Recursively flatten each element that is an array. ```js const deepFlatten = arr => [].concat(...arr.map(v => Array.isArray(v) ? deepFlatten(v) : v)); -// deepFlatten([1,[2],[[3],4],5]) -> [1,2,3,4,5] +``` + +```js +deepFlatten([1,[2],[[3],4],5]) -> [1,2,3,4,5] ``` [⬆ back to top](#table-of-contents) @@ -421,7 +433,10 @@ Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values no ```js const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); }; -// difference([1,2,3], [1,2,4]) -> [3] +``` + +```js +difference([1,2,3], [1,2,4]) -> [3] ``` [⬆ back to top](#table-of-contents) @@ -433,8 +448,11 @@ Filters out all values from an array for which the comparator function does not Use `Array.filter()` and `Array.find()` to find the appropriate values. ```js -const differenceWith = (arr, val, comp) => arr.filter(a => !val.find(b => comp(a, b))); -// differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) -> [1, 1.2] +const differenceWith = (arr, val, comp) => arr.filter(a => !val.find(b => comp(a, b))) +``` + +```js +differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) -> [1, 1.2] ``` [⬆ back to top](#table-of-contents) @@ -447,7 +465,10 @@ Use ES6 `Set` and the `...rest` operator to discard all duplicated values. ```js const distinctValuesOfArray = arr => [...new Set(arr)]; -// distinctValuesOfArray([1,2,2,3,4,4,5]) -> [1,2,3,4,5] +``` + +```js +distinctValuesOfArray([1,2,2,3,4,4,5]) -> [1,2,3,4,5] ``` [⬆ back to top](#table-of-contents) @@ -464,7 +485,10 @@ const dropElements = (arr, func) => { while (arr.length > 0 && !func(arr[0])) arr = arr.slice(1); return arr; }; -// dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4] +``` + +```js +dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4] ``` [⬆ back to top](#table-of-contents) @@ -477,9 +501,12 @@ Use `Array.slice()` to slice the remove the specified number of elements from th ```js const dropRight = (arr, n = 1) => arr.slice(0, -n); -// dropRight([1,2,3]) -> [1,2] -// dropRight([1,2,3], 2) -> [1] -// dropRight([1,2,3], 42) -> [] +``` + +```js +dropRight([1,2,3]) -> [1,2] +dropRight([1,2,3], 2) -> [1] +dropRight([1,2,3], 42) -> [] ``` [⬆ back to top](#table-of-contents) @@ -492,7 +519,10 @@ Use `Array.filter()` to create a new array that contains every nth element of a ```js const everyNth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1); -// everyNth([1,2,3,4,5,6], 2) -> [ 2, 4, 6 ] +``` + +```js +everyNth([1,2,3,4,5,6], 2) -> [ 2, 4, 6 ] ``` [⬆ back to top](#table-of-contents) @@ -505,7 +535,10 @@ Use `Array.filter()` for an array containing only the unique values. ```js const filterNonUnique = arr => arr.filter(i => arr.indexOf(i) === arr.lastIndexOf(i)); -// filterNonUnique([1,2,2,3,4,4,5]) -> [1,3,5] +``` + +```js +filterNonUnique([1,2,2,3,4,4,5]) -> [1,3,5] ``` [⬆ back to top](#table-of-contents) @@ -517,8 +550,11 @@ Flattens an array. Use a new array and concatenate it with the spread input array causing a shallow denesting of any contained arrays. ```js -const flatten = arr => [ ].concat(...arr); -// flatten([1,[2],3,4]) -> [1,2,3,4] +const flatten = arr => [ ].concat( ...arr ); +``` + +```js +flatten([1,[2],3,4]) -> [1,2,3,4] ``` [⬆ back to top](#table-of-contents) @@ -536,7 +572,10 @@ Omit the second element, `depth` to flatten only to a depth of `1` (single flatt const flattenDepth = (arr, depth = 1) => depth != 1 ? arr.reduce((a, v) => a.concat(Array.isArray(v) ? flattenDepth(v, depth - 1) : v), []) : arr.reduce((a, v) => a.concat(v), []); -// flattenDepth([1,[2],[[[3],4],5]], 2) -> [1,2,[3],4,5] +``` + +```js +flatten([1,[2],3,4]) -> [1,2,3,4] ``` [⬆ back to top](#table-of-contents) @@ -552,8 +591,11 @@ Use `Array.reduce()` to create an object, where the keys are produced from the m const groupBy = (arr, func) => arr.map(typeof func === 'function' ? func : val => val[func]) .reduce((acc, val, i) => { acc[val] = (acc[val] || []).concat(arr[i]); return acc; }, {}); -// groupBy([6.1, 4.2, 6.3], Math.floor) -> {4: [4.2], 6: [6.1, 6.3]} -// groupBy(['one', 'two', 'three'], 'length') -> {3: ['one', 'two'], 5: ['three']} +``` + +```js +groupBy([6.1, 4.2, 6.3], Math.floor) -> {4: [4.2], 6: [6.1, 6.3]} +groupBy(['one', 'two', 'three'], 'length') -> {3: ['one', 'two'], 5: ['three']} ``` [⬆ back to top](#table-of-contents) @@ -566,7 +608,10 @@ Use `arr[0]` to return the first element of the passed array. ```js const head = arr => arr[0]; -// head([1,2,3]) -> 1 +``` + +```js +head([1,2,3]) -> 1 ``` [⬆ back to top](#table-of-contents) @@ -579,7 +624,10 @@ Use `arr.slice(0,-1)` to return all but the last element of the array. ```js const initial = arr => arr.slice(0, -1); -// initial([1,2,3]) -> [1,2] +``` + +```js +initial([1,2,3]) -> [1,2] ``` [⬆ back to top](#table-of-contents) @@ -592,7 +640,10 @@ Use `Array.map()` to generate h rows where each is a new array of size w initial ```js const initialize2DArray = (w, h, val = null) => Array(h).fill().map(() => Array(w).fill(val)); -// initializeArrayWithRange(2, 2, 0) -> [[0,0], [0,0]] +``` + +```js +initialize2DArray(2, 2, 0) -> [[0,0], [0,0]] ``` [⬆ back to top](#table-of-contents) @@ -607,8 +658,11 @@ You can omit `start` to use a default value of `0`. ```js const initializeArrayWithRange = (end, start = 0) => Array.from({ length: (end + 1) - start }).map((v, i) => i + start); -// initializeArrayWithRange(5) -> [0,1,2,3,4,5] -// initializeArrayWithRange(7, 3) -> [3,4,5,6,7] +``` + +```js +initializeArrayWithRange(5) -> [0,1,2,3,4,5] +initializeArrayWithRange(7, 3) -> [3,4,5,6,7] ``` [⬆ back to top](#table-of-contents) @@ -622,7 +676,10 @@ You can omit `value` to use a default value of `0`. ```js const initializeArrayWithValues = (n, value = 0) => Array(n).fill(value); -// initializeArrayWithValues(5, 2) -> [2,2,2,2,2] +``` + +```js +initializeArrayWithValues(5, 2) -> [2,2,2,2,2] ``` [⬆ back to top](#table-of-contents) @@ -635,7 +692,10 @@ Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values co ```js const intersection = (a, b) => { const s = new Set(b); return a.filter(x => s.has(x)); }; -// intersection([1,2,3], [4,3,2]) -> [2,3] +``` + +```js +intersection([1,2,3], [4,3,2]) -> [2,3] ``` [⬆ back to top](#table-of-contents) @@ -648,7 +708,10 @@ Use `arr.length - 1` to compute the index of the last element of the given array ```js const last = arr => arr[arr.length - 1]; -// last([1,2,3]) -> 3 +``` + +```js +last([1,2,3]) -> 3 ``` [⬆ back to top](#table-of-contents) @@ -661,11 +724,12 @@ Use an anonymous inner function scope to declare an undefined memory space, usin ```js const mapObject = (arr, fn) => - (a => (a = [arr, arr.map(fn)], a[0].reduce((acc, val, ind) => (acc[val] = a[1][ind], acc), {})))(); -/* + (a => (a = [arr, arr.map(fn)], a[0].reduce( (acc,val,ind) => (acc[val] = a[1][ind], acc), {}) )) ( ); +``` + +```js const squareIt = arr => mapObject(arr, a => a*a) squareIt([1,2,3]) // { 1: 1, 2: 4, 3: 9 } -*/ ``` [⬆ back to top](#table-of-contents) @@ -679,9 +743,12 @@ If the index is out of bounds, return `[]`. Omit the second argument, `n`, to get the first element of the array. ```js -const nthElement = (arr, n = 0) => (n > 0 ? arr.slice(n, n + 1) : arr.slice(n))[0]; -// nthElement(['a','b','c'],1) -> 'b' -// nthElement(['a','b','b'],-3) -> 'a' +const nthElement = (arr, n=0) => (n>0? arr.slice(n,n+1) : arr.slice(n))[0]; +``` + +```js +nthElement(['a','b','c'],1) -> 'b' +nthElement(['a','b','b'],-3) -> 'a' ``` [⬆ back to top](#table-of-contents) @@ -695,7 +762,10 @@ Use `Array.reduce()` to convert the filtered/picked keys back to an object with ```js const pick = (obj, arr) => arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {}); -// pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) -> { 'a': 1, 'c': 3 } +``` + +```js +pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) -> { 'a': 1, 'c': 3 } ``` [⬆ back to top](#table-of-contents) @@ -716,14 +786,16 @@ const pull = (arr, ...args) => { arr.length = 0; pulled.forEach(v => arr.push(v)); }; +``` -// let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c']; -// pull(myArray1, 'a', 'c'); -// console.log(myArray1) -> [ 'b', 'b' ] +```js +let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c']; +pull(myArray1, 'a', 'c'); +console.log(myArray1) -> [ 'b', 'b' ] -// let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c']; -// pull(myArray2, ['a', 'c']); -// console.log(myArray2) -> [ 'b', 'b' ] +let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c']; +pull(myArray2, ['a', 'c']); +console.log(myArray2) -> [ 'b', 'b' ] ``` [⬆ back to top](#table-of-contents) @@ -734,23 +806,25 @@ Mutates the original array to filter out the values at the specified indexes. Use `Array.filter()` and `Array.includes()` to pull out the values that are not needed. Use `Array.length = 0` to mutate the passed in an array by resetting it's length to zero and `Array.push()` to re-populate it with only the pulled values. -Use `Array.push()` to keep track of pulled values +Use `Array.push()` to keep track of pulled values ```js const pullAtIndex = (arr, pullArr) => { let removed = []; let pulled = arr.map((v, i) => pullArr.includes(i) ? removed.push(v) : v) - .filter((v, i) => !pullArr.includes(i)); + .filter((v, i) => !pullArr.includes(i)) arr.length = 0; pulled.forEach(v => arr.push(v)); return removed; -}; +} +``` -// let myArray = ['a', 'b', 'c', 'd']; -// let pulled = pullAtIndex(myArray, [1, 3]); +```js +let myArray = ['a', 'b', 'c', 'd']; +let pulled = pullAtIndex(myArray, [1, 3]); -// console.log(myArray); -> [ 'a', 'c' ] -// console.log(pulled); -> [ 'b', 'd' ] +console.log(myArray); -> [ 'a', 'c' ] +console.log(pulled); -> [ 'b', 'd' ] ``` [⬆ back to top](#table-of-contents) @@ -761,7 +835,7 @@ Mutates the original array to filter out the values specified. Returns the remov Use `Array.filter()` and `Array.includes()` to pull out the values that are not needed. Use `Array.length = 0` to mutate the passed in an array by resetting it's length to zero and `Array.push()` to re-populate it with only the pulled values. -Use `Array.push()` to keep track of pulled values +Use `Array.push()` to keep track of pulled values ```js const pullAtValue = (arr, pullArr) => { @@ -771,13 +845,14 @@ const pullAtValue = (arr, pullArr) => { arr.length = 0; mutateTo.forEach(v => arr.push(v)); return removed; -}; -/* +} +``` + +```js let myArray = ['a', 'b', 'c', 'd']; let pulled = pullAtValue(myArray, ['b', 'd']); console.log(myArray); -> [ 'a', 'c' ] console.log(pulled); -> [ 'b', 'd' ] -*/ ``` [⬆ back to top](#table-of-contents) @@ -795,7 +870,10 @@ const remove = (arr, func) => arr.splice(arr.indexOf(val), 1); return acc.concat(val); }, []) : []; -// remove([1, 2, 3, 4], n => n % 2 == 0) -> [2, 4] +``` + +```js +remove([1, 2, 3, 4], n => n % 2 == 0) -> [2, 4] ``` [⬆ back to top](#table-of-contents) @@ -809,7 +887,10 @@ This method also works with strings. ```js const sample = arr => arr[Math.floor(Math.random() * arr.length)]; -// sample([3, 7, 9, 11]) -> 9 +``` + +```js +sample([3, 7, 9, 11]) -> 9 ``` [⬆ back to top](#table-of-contents) @@ -821,17 +902,11 @@ Randomizes the order of the values of an array, returning a new array. Uses the Fisher-Yates algoritm to reorder the elements of the array, based on the [Lodash implementation](https://github.com/lodash/lodash/blob/b2ea6b1cd251796dcb5f9700c4911a7b6223920b/shuffle.js), but as a pure function. ```js -const shuffle = ([...arr]) => { - let m = arr.length; - while (m) { - const i = Math.floor(Math.random() * m--); - [arr[m], arr[i]] = [arr[i], arr[m]]; - } - return arr; -}; -// const foo = [1,2,3] -// shuffle(foo) -> [2,3,1] -// console.log(foo) -> [1,2,3] +const shuffle = arr => arr.sort(() => Math.random() - 0.5); +``` + +```js +shuffle([1,2,3]) -> [2,3,1] ``` [⬆ back to top](#table-of-contents) @@ -844,7 +919,10 @@ Use `filter()` to remove values that are not part of `values`, determined using ```js const similarity = (arr, values) => arr.filter(v => values.includes(v)); -// similarity([1,2,3], [1,2,4]) -> [1,2] +``` + +```js +similarity([1,2,3], [1,2,4]) -> [1,2] ``` [⬆ back to top](#table-of-contents) @@ -859,8 +937,11 @@ Create a `Set` from each array, then use `Array.filter()` on each of them to onl const symmetricDifference = (a, b) => { const sA = new Set(a), sB = new Set(b); return [...a.filter(x => !sB.has(x)), ...b.filter(x => !sA.has(x))]; -}; -// symmetricDifference([1,2,3], [1,2,4]) -> [3,4] +} +``` + +```js +symmetricDifference([1,2,3], [1,2,4]) -> [3,4] ``` [⬆ back to top](#table-of-contents) @@ -873,8 +954,11 @@ Return `arr.slice(1)` if the array's `length` is more than `1`, otherwise, retur ```js const tail = arr => arr.length > 1 ? arr.slice(1) : arr; -// tail([1,2,3]) -> [2,3] -// tail([1]) -> [1] +``` + +```js +tail([1,2,3]) -> [2,3] +tail([1]) -> [1] ``` [⬆ back to top](#table-of-contents) @@ -887,8 +971,11 @@ Use `Array.slice()` to create a slice of the array with `n` elements taken from ```js const take = (arr, n = 1) => arr.slice(0, n); -// take([1, 2, 3], 5) -> [1, 2, 3] -// take([1, 2, 3], 0) -> [] +``` + +```js +take([1, 2, 3], 5) -> [1, 2, 3] +take([1, 2, 3], 0) -> [] ``` [⬆ back to top](#table-of-contents) @@ -901,8 +988,11 @@ Use `Array.slice()` to create a slice of the array with `n` elements taken from ```js const takeRight = (arr, n = 1) => arr.slice(arr.length - n, arr.length); -// takeRight([1, 2, 3], 2) -> [ 2, 3 ] -// takeRight([1, 2, 3]) -> [3] +``` + +```js +takeRight([1, 2, 3], 2) -> [ 2, 3 ] +takeRight([1, 2, 3]) -> [3] ``` [⬆ back to top](#table-of-contents) @@ -915,7 +1005,10 @@ Create a `Set` with all values of `a` and `b` and convert to an array. ```js const union = (a, b) => Array.from(new Set([...a, ...b])); -// union([1,2,3], [4,3,2]) -> [1,2,3,4] +``` + +```js +union([1,2,3], [4,3,2]) -> [1,2,3,4] ``` [⬆ back to top](#table-of-contents) @@ -930,7 +1023,10 @@ _(For a snippet that mutates the original array see [`pull`](#pull))_ ```js const without = (arr, ...args) => arr.filter(v => !args.includes(v)); -// without([2, 1, 2, 3], 1, 2) -> [3] +``` + +```js +without([2, 1, 2, 3], 1, 2) -> [3] ``` [⬆ back to top](#table-of-contents) @@ -947,11 +1043,14 @@ If lengths of the argument-arrays vary, `undefined` is used where no value could const zip = (...arrays) => { const maxLength = Math.max(...arrays.map(x => x.length)); return Array.from({length: maxLength}).map((_, i) => { - return Array.from({length: arrays.length}, (_, k) => arrays[k][i]); - }); -}; -// zip(['a', 'b'], [1, 2], [true, false]); -> [['a', 1, true], ['b', 2, false]] -// zip(['a'], [1, 2], [true, false]); -> [['a', 1, true], [undefined, 2, false]] + return Array.from({length: arrays.length}, (_, k) => arrays[k][i]); + }) +} +``` + +```js +zip(['a', 'b'], [1, 2], [true, false]); -> [['a', 1, true], ['b', 2, false]] +zip(['a'], [1, 2], [true, false]); -> [['a', 1, true], [undefined, 2, false]] ``` [⬆ back to top](#table-of-contents) @@ -963,9 +1062,12 @@ Given an array of valid property identifiers and an array of values, return an o Since an object can have undefined values but not undefined property pointers, the array of properties is used to decide the structure of the resulting object using `Array.reduce()`. ```js -const zipObject = (props, values) => props.reduce((obj, prop, index) => (obj[prop] = values[index], obj), {}); -// zipObject(['a','b','c'], [1,2]) -> {a: 1, b: 2, c: undefined} -// zipObject(['a','b'], [1,2,3]) -> {a: 1, b: 2} +const zipObject = ( props, values ) => props.reduce( ( obj, prop, index ) => ( obj[prop] = values[index], obj ), {} ) +``` + +```js +zipObject(['a','b','c'], [1,2]) -> {a: 1, b: 2, c: undefined} +zipObject(['a','b'], [1,2,3]) -> {a: 1, b: 2} ``` [⬆ back to top](#table-of-contents) @@ -978,8 +1080,11 @@ Converts the given array elements into `
  • ` tags and appends them to the list Use `Array.map()` and `document.querySelector()` to create a list of html tags. ```js -const arrayToHtmlList = (arr, listID) => arr.map(item => document.querySelector('#' + listID).innerHTML += `
  • ${item}
  • `); -// arrayToHtmlList(['item 1', 'item 2'],'myListID') +const arrayToHtmlList = (arr, listID) => arr.map(item => document.querySelector("#"+listID).innerHTML+=`
  • ${item}
  • `); +``` + +```js +arrayToHtmlList(['item 1', 'item 2'],'myListID') ``` [⬆ back to top](#table-of-contents) @@ -993,6 +1098,9 @@ Use `scrollY`, `scrollHeight` and `clientHeight` to determine if the bottom of t ```js const bottomVisible = () => document.documentElement.clientHeight + window.scrollY >= (document.documentElement.scrollHeight || document.documentElement.clientHeight); +``` + +```js // bottomVisible() -> true ``` @@ -1006,7 +1114,10 @@ Use `window.location.href` to get current URL. ```js const currentURL = () => window.location.href; -// currentUrl() -> 'https://google.com' +``` + +```js +currentUrl() -> 'https://google.com' ``` [⬆ back to top](#table-of-contents) @@ -1018,9 +1129,12 @@ Detects wether the website is being opened in a mobile device or a desktop/lapto Use a regular expression to test the `navigator.userAgent` property to figure out if the device is a mobile device or a desktop/laptop. ```js -const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? 'Mobile' : 'Desktop'; -// detectDeviceType() -> "Mobile" -// detectDeviceType() -> "Desktop" +const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? "Mobile" : "Desktop"; +``` + +```js +detectDeviceType() -> "Mobile" +detectDeviceType() -> "Desktop" ``` [⬆ back to top](#table-of-contents) @@ -1043,9 +1157,12 @@ const elementIsVisibleInViewport = (el, partiallyVisible = false) => { ((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth)) : top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth; }; +``` + +```js // e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10} -// elementIsVisibleInViewport(el) -> false (not fully visible) -// elementIsVisibleInViewport(el, true) -> true (partially visible) +elementIsVisibleInViewport(el) -> false // (not fully visible) +elementIsVisibleInViewport(el, true) -> true // (partially visible) ``` [⬆ back to top](#table-of-contents) @@ -1061,7 +1178,10 @@ You can omit `el` to use a default value of `window`. const getScrollPosition = (el = window) => ({x: (el.pageXOffset !== undefined) ? el.pageXOffset : el.scrollLeft, y: (el.pageYOffset !== undefined) ? el.pageYOffset : el.scrollTop}); -// getScrollPosition() -> {x: 0, y: 200} +``` + +```js +getScrollPosition() -> {x: 0, y: 200} ``` [⬆ back to top](#table-of-contents) @@ -1078,7 +1198,10 @@ const getURLParameters = url => url.match(/([^?=&]+)(=([^&]*))/g).reduce( (a, v) => (a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1), a), {} ); -// getURLParameters('http://url.com/page?name=Adam&surname=Smith') -> {name: 'Adam', surname: 'Smith'} +``` + +```js +getURLParameters('http://url.com/page?name=Adam&surname=Smith') -> {name: 'Adam', surname: 'Smith'} ``` [⬆ back to top](#table-of-contents) @@ -1107,7 +1230,10 @@ Pass a second argument to simulate a link click (`true` - default) or an HTTP re ```js const redirect = (url, asLink = true) => asLink ? window.location.href = url : window.location.replace(url); -// redirect('https://google.com') +``` + +```js +redirect('https://google.com') ``` [⬆ back to top](#table-of-contents) @@ -1127,7 +1253,10 @@ const scrollToTop = () => { window.scrollTo(0, c - c / 8); } }; -// scrollToTop() +``` + +```js +scrollToTop() ``` [⬆ back to top](#table-of-contents) @@ -1141,7 +1270,10 @@ Calculate the difference (in days) between two `Date` objects. ```js const getDaysDiffBetweenDates = (dateInitial, dateFinal) => (dateFinal - dateInitial) / (1000 * 3600 * 24); -// getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) -> 9 +``` + +```js +getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) -> 9 ``` [⬆ back to top](#table-of-contents) @@ -1157,7 +1289,10 @@ const JSONToDate = arr => { const dt = new Date(parseInt(arr.toString().substr(6))); return `${dt.getDate()}/${dt.getMonth() + 1}/${dt.getFullYear()}`; }; -// JSONToDate(/Date(1489525200000)/) -> "14/3/2017" +``` + +```js +JSONToDate(/Date(1489525200000)/) -> "14/3/2017" ``` [⬆ back to top](#table-of-contents) @@ -1170,8 +1305,12 @@ Use `Date.toISOString()`, `split('T')` and `replace()` to convert a date from Am Throws an error if the passed time cannot be converted to a date. ```js -const toEnglishDate = (time) => { try { return new Date(time).toISOString().split('T')[0].replace(/-/g, '/'); } catch (e) {} }; -// toEnglishDate('09/21/2010') -> '21/09/2010' +const toEnglishDate = (time) => + {try{return new Date(time).toISOString().split('T')[0].replace(/-/g, '/')}catch(e){return}}; +``` + +```js +toEnglishDate('09/21/2010') -> '21/09/2010' ``` [⬆ back to top](#table-of-contents) @@ -1197,13 +1336,14 @@ Loop through an array of functions containing asynchronous events, calling `next ```js const chainAsync = fns => { let curr = 0; const next = () => fns[curr++](next); next(); }; -/* +``` + +```js chainAsync([ next => { console.log('0 seconds'); setTimeout(next, 1000); }, next => { console.log('1 second'); setTimeout(next, 1000); }, next => { console.log('2 seconds'); } ]) -*/ ``` [⬆ back to top](#table-of-contents) @@ -1217,12 +1357,13 @@ The last (rightmost) function can accept one or more arguments; the remaining fu ```js const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args))); -/* +``` + +```js const add5 = x => x + 5 const multiply = (x, y) => x * y const multiplyAndAdd5 = compose(add5, multiply) multiplyAndAdd5(5, 2) -> 15 -*/ ``` [⬆ back to top](#table-of-contents) @@ -1241,8 +1382,11 @@ const curry = (fn, arity = fn.length, ...args) => arity <= args.length ? fn(...args) : curry.bind(null, fn, arity, ...args); -// curry(Math.pow)(2)(10) -> 1024 -// curry(Math.min, 3)(10)(50)(2) -> 2 +``` + +```js +curry(Math.pow)(2)(10) -> 1024 +curry(Math.min, 3)(10)(50)(2) -> 2 ``` [⬆ back to top](#table-of-contents) @@ -1255,7 +1399,30 @@ Use `console.debug()` and the `name` property of the passed method to log the me ```js const functionName = fn => (console.debug(fn.name), fn); -// functionName(Math.max) -> max (logged in debug channel of console) +``` + +```js +functionName(Math.max) -> max (logged in debug channel of console) +``` + +[⬆ back to top](#table-of-contents) + +### pipe + +Performs left-to-right function composition. + +Use `Array.reduce()` with the spread operator (`...`) to perform left-to-right function composition. +The first (leftmost) function can accept one or more arguments; the remaining functions must be unary. + +```js +const pipeFunctions = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args))); +``` + +```js +const add5 = x => x + 5 +const multiply = (x, y) => x * y +const multiplyAndAdd5 = pipeFunctions(multiply, add5) +multiplyAndAdd5(5, 2) -> 15 ``` [⬆ back to top](#table-of-contents) @@ -1268,8 +1435,11 @@ Use `Array.reduce()` to create a promise chain, where each promise returns the n ```js const runPromisesInSeries = ps => ps.reduce((p, next) => p.then(next), Promise.resolve()); -// const delay = (d) => new Promise(r => setTimeout(r, d)) -// runPromisesInSeries([() => delay(1000), () => delay(2000)]) -> executes each promise sequentially, taking a total of 3 seconds to complete +``` + +```js +const delay = (d) => new Promise(r => setTimeout(r, d)) +runPromisesInSeries([() => delay(1000), () => delay(2000)]) -> //executes each promise sequentially, taking a total of 3 seconds to complete ``` [⬆ back to top](#table-of-contents) @@ -1282,13 +1452,14 @@ Delay executing part of an `async` function, by putting it to sleep, returning a ```js const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); -/* +``` + +```js async function sleepyWork() { console.log('I\'m going to sleep for 1 second.'); await sleep(1000); console.log('I woke up after 1 second.'); } -*/ ``` [⬆ back to top](#table-of-contents) @@ -1302,8 +1473,11 @@ Take a predicate function and apply `not` to it with its arguments. ```js const negate = func => (...args) => !func(...args); -// filter([1, 2, 3, 4, 5, 6], negate(isEven)) -> [1, 3, 5] -// negate(isOdd)(1) -> false +``` + +```js +filter([1, 2, 3, 4, 5, 6], negate(isEven)) -> [1, 3, 5] +negate(isOdd)(1) -> false ``` [⬆ back to top](#table-of-contents) @@ -1317,7 +1491,10 @@ Use `Array.reduce()` to add each value to an accumulator, initialized with a val ```js const arrayAverage = arr => arr.reduce((acc, val) => acc + val, 0) / arr.length; -// arrayAverage([1,2,3]) -> 2 +``` + +```js +arrayAverage([1,2,3]) -> 2 ``` [⬆ back to top](#table-of-contents) @@ -1330,7 +1507,10 @@ Use `Array.reduce()` to add each value to an accumulator, initialized with a val ```js const arraySum = arr => arr.reduce((acc, val) => acc + val, 0); -// arraySum([1,2,3,4]) -> 10 +``` + +```js +arraySum([1,2,3,4]) -> 10 ``` [⬆ back to top](#table-of-contents) @@ -1339,14 +1519,21 @@ const arraySum = arr => arr.reduce((acc, val) => acc + val, 0); Clamps `num` within the inclusive range specified by the boundary values `a` and `b` -If `num` falls within the range, return `num`. +If `lower` is greater than `upper`, swap them. +If `num` falls within the range, return `num`. Otherwise, return the nearest number in the range. ```js -const clampNumber = (num, a, b) => Math.max(Math.min(num, Math.max(a,b)),Math.min(a,b)); -// clampNumber(2, 3, 5) -> 3 -// clampNumber(1, -1, -5) -> -1 -// clampNumber(3, 2, 4) -> 3 +const clampNumber = (num, lower, upper) => { + if(lower > upper) upper = [lower, lower = upper][0]; + return (num>=lower && num<=upper) ? num : ((num < lower) ? lower : upper) +} +``` + +```js +clampNumber(2, 3, 5) -> 3 +clampNumber(1, -1, -5) -> -1 +clampNumber(3, 2, 4) -> 3 ``` [⬆ back to top](#table-of-contents) @@ -1359,8 +1546,11 @@ If `n` is even, return `n/2`. Otherwise, return `3n+1`. ```js const collatz = n => (n % 2 == 0) ? (n / 2) : (3 * n + 1); -// collatz(8) --> 4 -// collatz(5) --> 16 +``` + +```js +collatz(8) -> 4 +collatz(5) -> 16 ``` [⬆ back to top](#table-of-contents) @@ -1373,8 +1563,11 @@ Convert the number to a string, using spread operators in ES6(`[...string]`) bui Use `Array.map()` and `parseInt()` to transform each value to an integer. ```js -const digitize = n => [...'' + n].map(i => parseInt(i)); -// digitize(2334) -> [2, 3, 3, 4] +const digitize = n => [...''+n].map(i => parseInt(i)); +``` + +```js +differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) -> [1, 1.2] ``` [⬆ back to top](#table-of-contents) @@ -1387,7 +1580,10 @@ Use `Math.hypot()` to calculate the Euclidean distance between two points. ```js const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0); -// distance(1,1, 2,3) -> 2.23606797749979 +``` + +```js +distance(1,1, 2,3) -> 2.23606797749979 ``` [⬆ back to top](#table-of-contents) @@ -1405,7 +1601,10 @@ Throws an exception if `n` is a negative number. const factorial = n => n < 0 ? (() => { throw new TypeError('Negative numbers are not allowed!'); })() : n <= 1 ? 1 : n * factorial(n - 1); -// factorial(6) -> 720 +``` + +```js +factorial(6) -> 720 ``` [⬆ back to top](#table-of-contents) @@ -1420,7 +1619,10 @@ Use `Array.reduce()` to add values into the array, using the sum of the last two ```js const fibonacci = n => Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []); -// fibonacci(5) -> [0,1,1,2,3] +``` + +```js +factorial(6) -> 720 ``` [⬆ back to top](#table-of-contents) @@ -1433,8 +1635,11 @@ Use a mathematical formula to calculate the number of fibonacci numbers until `n ```js const fibonacciCountUntilNum = num => - Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2)); -// fibonacciCountUntilNum(10) -> 7 + Math.ceil(Math.log(num * Math.sqrt(5) + 1/2) / Math.log((Math.sqrt(5)+1)/2)); +``` + +```js +fibonacciCountUntilNum(10) -> 7 ``` [⬆ back to top](#table-of-contents) @@ -1451,8 +1656,11 @@ Uses a mathematical formula to calculate the length of the array required. const fibonacciUntilNum = num => { let n = Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2)); return Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []); -}; -// fibonacciUntilNum(15) -> [0,1,1,2,3,5,8,13] +} +``` + +```js +fibonacciCountUntilNum(10) -> 7 ``` [⬆ back to top](#table-of-contents) @@ -1467,7 +1675,10 @@ Otherwise, return the GCD of `y` and the remainder of the division `x/y`. ```js const gcd = (x, y) => !y ? x : gcd(y, x % y); -// gcd (8, 36) -> 4 +``` + +```js +gcd (8, 36) -> 4 ``` [⬆ back to top](#table-of-contents) @@ -1482,27 +1693,33 @@ Count and return the number of `1`s in the string, using `match(/1/g)`. ```js const hammingDistance = (num1, num2) => ((num1 ^ num2).toString(2).match(/1/g) || '').length; -// hammingDistance(2,3) -> 1 +``` + +```js +hammingDistance(2,3) -> 1 ``` [⬆ back to top](#table-of-contents) ### inRange -Checks if the given number falls within the given range. +Checks if the given number falls within the given range. Use arithmetic comparison to check if the given number is in the specified range. If the second parameter, `end`, is not specified, the range is considered to be from `0` to `start`. ```js -const inRange = (n, start, end = null) => { - if (end && start > end) end = [start, start = end][0]; - return (end == null) ? (n >= 0 && n < start) : (n >= start && n < end); -}; -// inRange(3, 2, 5) -> true -// inRange(3, 4) -> true -// inRange(2, 3, 5) -> false -// inrange(3, 2) -> false +const inRange = (n, start, end=null) => { + if(end && start > end) end = [start, start=end][0]; + return (end == null) ? (n>=0 && n=start && n true +inRange(3, 4) -> true +inRange(2, 3, 5) -> false +inrange(3, 2) -> false ``` [⬆ back to top](#table-of-contents) @@ -1515,10 +1732,13 @@ Convert the given number into an array of digits. Use `Math.pow()` to get the ap ```js const isArmstrongNumber = digits => - (arr => arr.reduce((a, d) => a + Math.pow(parseInt(d), arr.length), 0) == digits)((digits + '').split('')); -// isArmstrongNumber(1634) -> true -// isArmstrongNumber(371) -> true -// isArmstrongNumber(56) -> false + ( arr => arr.reduce( ( a, d ) => a + Math.pow( parseInt( d ), arr.length ), 0 ) == digits ? true : false )( ( digits+'' ).split( '' ) ); +``` + +```js +isArmstrongNumber(1634) -> true +isArmstrongNumber(371) -> true +isArmstrongNumber(56) -> false ``` [⬆ back to top](#table-of-contents) @@ -1531,7 +1751,10 @@ Use the modulo operator (`%`) to check if the remainder is equal to `0`. ```js const isDivisible = (dividend, divisor) => dividend % divisor === 0; -// isDivisible(6,3) -> true +``` + +```js +isDivisible(6,3) -> true ``` [⬆ back to top](#table-of-contents) @@ -1545,7 +1768,10 @@ Returns `true` if the number is even, `false` if the number is odd. ```js const isEven = num => num % 2 === 0; -// isEven(3) -> false +``` + +```js +isEven(3) -> false ``` [⬆ back to top](#table-of-contents) @@ -1554,7 +1780,7 @@ const isEven = num => num % 2 === 0; Checks if the provided integer is a prime number. -Check numbers from `2` to the square root of the given number. +Check numbers from `2` to the square root of the given number. Return `false` if any of them divides the given number, else return `true`, unless the number is less than `2`. ```js @@ -1563,8 +1789,11 @@ const isPrime = num => { for (var i = 2; i * i <= boundary; i++) if (num % i == 0) return false; return num >= 2; }; -// isPrime(11) -> true -// isPrime(12) -> false +``` + +```js +isPrime(11) -> true +isPrime(12) -> false ``` [⬆ back to top](#table-of-contents) @@ -1581,7 +1810,10 @@ const lcm = (x, y) => { const gcd = (x, y) => !y ? x : gcd(y, x % y); return Math.abs(x * y) / (gcd(x, y)); }; -// lcm(12,7) -> 84 +``` + +```js +lcm(12,7) -> 84 ``` [⬆ back to top](#table-of-contents) @@ -1598,8 +1830,11 @@ const median = arr => { const mid = Math.floor(arr.length / 2), nums = [...arr].sort((a, b) => a - b); return arr.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2; }; -// median([5,6,50,1,-5]) -> 5 -// median([0,10,-2,7]) -> 3.5 +``` + +```js +median([5,6,50,1,-5]) -> 5 +median([0,10,-2,7]) -> 3.5 ``` [⬆ back to top](#table-of-contents) @@ -1616,8 +1851,11 @@ const palindrome = str => { const s = str.toLowerCase().replace(/[\W_]/g,''); return s === s.split('').reverse().join(''); } -// palindrome('taco cat') -> true - ``` +``` + +```js +palindrome('taco cat') -> true +``` [⬆ back to top](#table-of-contents) @@ -1630,8 +1868,11 @@ Use `Array.reduce()` to calculate how many numbers are below the value and how m ```js const percentile = (arr, val) => 100 * arr.reduce((acc,v) => acc + (v < val ? 1 : 0) + (v === val ? 0.5 : 0), 0) / arr.length; -// percentile([1,2,3,4,5,6,7,8,9,10], 6) -> 55 - ``` +``` + +```js +percentile([1,2,3,4,5,6,7,8,9,10], 6) -> 55 +``` [⬆ back to top](#table-of-contents) @@ -1644,12 +1885,15 @@ Use `Array.reduce()` combined with `Array.map()` to iterate over elements and co ```js const powerset = arr => arr.reduce((a, v) => a.concat(a.map(r => [v].concat(r))), [[]]); -// powerset([1,2]) -> [[], [1], [2], [2,1]] +``` + +```js +powerset([1,2]) -> [[], [1], [2], [2,1]] ``` [⬆ back to top](#table-of-contents) -### primes +### primes Generates primes up to a given number, using the Sieve of Eratosthenes. @@ -1657,13 +1901,16 @@ Generate an array from `2` to the given number. Use `Array.filter()` to filter o ```js const primes = num => { - let arr = Array.from({length: num - 1}).map((x, i) => i + 2), - sqroot = Math.floor(Math.sqrt(num)), - numsTillSqroot = Array.from({length: sqroot - 1}).map((x, i) => i + 2); - numsTillSqroot.forEach(x => arr = arr.filter(y => ((y % x) !== 0) || (y == x))); + let arr = Array.from({length:num-1}).map((x,i)=> i+2), + sqroot = Math.floor(Math.sqrt(num)), + numsTillSqroot = Array.from({length:sqroot-1}).map((x,i)=> i+2); + numsTillSqroot.forEach(x => arr = arr.filter(y => ((y%x)!==0)||(y==x))); return arr; -}; -// primes(10) -> [2,3,5,7] +} +``` + +```js +primes(10) -> [2,3,5,7] ``` [⬆ back to top](#table-of-contents) @@ -1676,7 +1923,10 @@ Use `Math.random()` to generate a random number and map it to the desired range, ```js const randomIntegerInRange = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; -// randomIntegerInRange(0, 5) -> 2 +``` + +```js +randomIntegerInRange(0, 5) -> 2 ``` [⬆ back to top](#table-of-contents) @@ -1689,7 +1939,10 @@ Use `Math.random()` to generate a random value, map it to the desired range usin ```js const randomNumberInRange = (min, max) => Math.random() * (max - min) + min; -// randomNumberInRange(2,10) -> 6.0211363285087005 +``` + +```js +randomNumberInRange(2,10) -> 6.0211363285087005 ``` [⬆ back to top](#table-of-contents) @@ -1702,8 +1955,11 @@ Use `Math.round()` and template literals to round the number to the specified nu Omit the second argument, `decimals` to round to an integer. ```js -const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`); -// round(1.005, 2) -> 1.01 +const round = (n, decimals=0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`); +``` + +```js +round(1.005, 2) -> 1.01 ``` [⬆ back to top](#table-of-contents) @@ -1743,8 +1999,11 @@ const standardDeviation = (arr, usePopulation = false) => { .reduce((acc, val) => acc + val, 0) / (arr.length - (usePopulation ? 0 : 1)) ); }; -// standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample) -// standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population) +``` + +```js +standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample) +standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population) ``` [⬆ back to top](#table-of-contents) @@ -1765,7 +2024,10 @@ const speechSynthesis = message => { msg.voice = window.speechSynthesis.getVoices()[0]; window.speechSynthesis.speak(msg); }; -// speechSynthesis('Hello, World') -> plays the message +``` + +```js +speechSynthesis('Hello, World') -> // plays the message ``` [⬆ back to top](#table-of-contents) @@ -1779,8 +2041,11 @@ Use `fs.writeFile()`, template literals and `JSON.stringify()` to write a `json` ```js const fs = require('fs'); -const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2)); -// JSONToFile({test: "is passed"}, 'testJsonFile') -> writes the object to 'testJsonFile.json' +const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2)) +``` + +```js +JSONToFile({test: "is passed"}, 'testJsonFile') -> writes the object to 'testJsonFile.json' ``` [⬆ back to top](#table-of-contents) @@ -1795,16 +2060,17 @@ creating an array from contents of file by `split`ing file content line by line ```js const fs = require('fs'); -const readFileLines = filename => fs.readFileSync(filename).toString('UTF8').split(/\r?\n/); -/* - contents of test.txt : - line1 - line2 - line3 - ___________________________ - let arr = readFileLines('test.txt') - console.log(arr) // -> ['line1', 'line2', 'line3'] - */ +const readFileLines = filename => fs.readFileSync(filename).toString('UTF8').split('\n'); +``` + +```js +contents of test.txt : + line1 + line2 + line3 + ___________________________ +let arr = readFileLines('test.txt') +console.log(arr) // -> ['line1', 'line2', 'line3'] ``` [⬆ back to top](#table-of-contents) @@ -1825,13 +2091,14 @@ const cleanObj = (obj, keysToKeep = [], childIndicator) => { } else if (!keysToKeep.includes(key)) { delete obj[key]; } -  }); - return obj; -}; -/* - const testObj = {a: 1, b: 2, children: {a: 1, b: 2}} - cleanObj(testObj, ["a"],"children") // { a: 1, children : { a: 1}} -*/ + }) +} +``` + +```js +const testObj = {a: 1, b: 2, children: {a: 1, b: 2}} +cleanObj(testObj, ["a"],"children") +console.log(testObj) // { a: 1, children : { a: 1}} ``` [⬆ back to top](#table-of-contents) @@ -1844,7 +2111,10 @@ Use `Array.reduce()` to create and combine key-value pairs. ```js const objectFromPairs = arr => arr.reduce((a, v) => (a[v[0]] = v[1], a), {}); -// objectFromPairs([['a',1],['b',2]]) -> {a: 1, b: 2} +``` + +```js +objectFromPairs([['a',1],['b',2]]) -> {a: 1, b: 2} ``` [⬆ back to top](#table-of-contents) @@ -1857,7 +2127,10 @@ Use `Object.keys()` and `Array.map()` to iterate over the object's keys and prod ```js const objectToPairs = obj => Object.keys(obj).map(k => [k, obj[k]]); -// objectToPairs({a: 1, b: 2}) -> [['a',1],['b',2]]) +``` + +```js +objectToPairs({a: 1, b: 2}) -> [['a',1],['b',2]]) ``` [⬆ back to top](#table-of-contents) @@ -1880,12 +2153,13 @@ const orderBy = (arr, props, orders) => return acc; }, 0) ); -/* +``` + +```js const users = [{ 'name': 'fred', 'age': 48 },{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 },{ 'name': 'barney', 'age': 34 }]; orderby(users, ['name', 'age'], ['asc', 'desc']) -> [{name: 'barney', age: 36}, {name: 'barney', age: 34}, {name: 'fred', age: 48}, {name: 'fred', age: 40}] orderby(users, ['name', 'age']) -> [{name: 'barney', age: 34}, {name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}] -*/ ``` [⬆ back to top](#table-of-contents) @@ -1899,9 +2173,11 @@ If the property does not exists returns `undefined`. ```js const select = (from, selector) => selector.split('.').reduce((prev, cur) => prev && prev[cur], from); +``` -// const obj = {selector: {to: {val: 'val to select'}}}; -// select(obj, 'selector.to.val'); -> 'val to select' +```js +const obj = {selector: {to: {val: 'val to select'}}}; +select(obj, 'selector.to.val'); -> 'val to select' ``` [⬆ back to top](#table-of-contents) @@ -1914,11 +2190,12 @@ Use `Object.assign()` and an empty object (`{}`) to create a shallow clone of th ```js const shallowClone = obj => Object.assign({}, obj); -/* +``` + +```js const a = { x: true, y: 1 }; const b = shallowClone(a); a === b -> false -*/ ``` [⬆ back to top](#table-of-contents) @@ -1928,10 +2205,13 @@ a === b -> false Checks if the predicate (second argument) is truthy on all elements of a collection (first argument). Use `Array.every()` to check if each passed object has the specified property and if it returns a truthy value. - + ```js const truthCheckCollection = (collection, pre) => (collection.every(obj => obj[pre])); -// truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") -> true +``` + +```js +truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") -> true ``` [⬆ back to top](#table-of-contents) @@ -1952,7 +2232,10 @@ const anagrams = str => { return str.split('').reduce((acc, letter, i) => acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)), []); }; -// anagrams('abc') -> ['abc','acb','bac','bca','cab','cba'] +``` + +```js +anagrams('abc') -> ['abc','acb','bac','bca','cab','cba'] ``` [⬆ back to top](#table-of-contents) @@ -1967,8 +2250,11 @@ Omit the `lowerRest` parameter to keep the rest of the string intact, or set it ```js const capitalize = ([first, ...rest], lowerRest = false) => first.toUpperCase() + (lowerRest ? rest.join('').toLowerCase() : rest.join('')); -// capitalize('myName') -> 'MyName' -// capitalize('myName', true) -> 'Myname' +``` + +```js +capitalize('fooBar') -> 'FooBar' +capitalize('fooBar', true) -> 'Foobar' ``` [⬆ back to top](#table-of-contents) @@ -1981,7 +2267,10 @@ Use `replace()` to match the first character of each word and `toUpperCase()` to ```js const capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase()); -// capitalizeEveryWord('hello world!') -> 'Hello World!' +``` + +```js +capitalizeEveryWord('hello world!') -> 'Hello World!' ``` [⬆ back to top](#table-of-contents) @@ -1994,8 +2283,11 @@ Use a regular expression to count the number of vowels `(A, E, I, O, U)` in a `s ```js const countVowels = str => (str.match(/[aeiou]/ig) || []).length; -// countVowels('foobar') -> 3 -// countVowels('gym') -> 0 +``` + +```js +countVowels('foobar') -> 3 +countVowels('gym') -> 0 ``` [⬆ back to top](#table-of-contents) @@ -2008,7 +2300,10 @@ Use `replace()` to escape special characters. ```js const escapeRegExp = str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); -// escapeRegExp('(test)') -> \\(test\\) +``` + +```js +escapeRegExp('(test)') -> \\(test\\) ``` [⬆ back to top](#table-of-contents) @@ -2024,9 +2319,12 @@ Omit the second argument to use a default separator of `_`. const fromCamelCase = (str, separator = '_') => str.replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2') .replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + separator + '$2').toLowerCase(); -// fromCamelCase('someDatabaseFieldName', ' ') -> 'some database field name' -// fromCamelCase('someLabelThatNeedsToBeCamelized', '-') -> 'some-label-that-needs-to-be-camelized' -// fromCamelCase('someJavascriptProperty', '_') -> 'some_javascript_property' +``` + +```js +fromCamelCase('someDatabaseFieldName', ' ') -> 'some database field name' +fromCamelCase('someLabelThatNeedsToBeCamelized', '-') -> 'some-label-that-needs-to-be-camelized' +fromCamelCase('someJavascriptProperty', '_') -> 'some_javascript_property' ``` [⬆ back to top](#table-of-contents) @@ -2038,11 +2336,14 @@ Repeats a string n times using `String.repeat()` If no string is provided the default is `""` and the default number of times is 2. ```js -const repeatString = (str = '', num = 2) => { - return num >= 0 ? str.repeat(num) : str; -}; -// repeatString("abc",3) -> 'abcabcabc' -// repeatString("abc") -> 'abcabc' +const repeatString = (str="",num=2) => { + return num >= 0 ? str.repeat(num) : str; +} +``` + +```js +repeatString("abc",3) -> 'abcabcabc' +repeatString("abc") -> 'abcabc' ``` [⬆ back to top](#table-of-contents) @@ -2056,7 +2357,10 @@ Combine characters to get a string using `join('')`. ```js const reverseString = str => str.split('').reverse().join(''); -// reverseString('foobar') -> 'raboof' +``` + +```js +reverseString('foobar') -> 'raboof' ``` [⬆ back to top](#table-of-contents) @@ -2070,7 +2374,10 @@ Split the string using `split('')`, `Array.sort()` utilizing `localeCompare()`, ```js const sortCharactersInString = str => str.split('').sort((a, b) => a.localeCompare(b)).join(''); -// sortCharactersInString('cabbage') -> 'aabbceg' +``` + +```js +sortCharactersInString('cabbage') -> 'aabbceg' ``` [⬆ back to top](#table-of-contents) @@ -2087,12 +2394,15 @@ const toCamelCase = str => { let s = str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) .map(x => x.slice(0, 1).toUpperCase() + x.slice(1).toLowerCase()) .join(''); - return s.slice(0, 1).toLowerCase() + s.slice(1); -}; -// toCamelCase("some_database_field_name") -> 'someDatabaseFieldName' -// toCamelCase("Some label that needs to be camelized") -> 'someLabelThatNeedsToBeCamelized' -// toCamelCase("some-javascript-property") -> 'someJavascriptProperty' -// toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") -> 'someMixedStringWithSpacesUnderscoresAndHyphens' + return s.slice(0,1).toLowerCase() + s.slice(1) + } +``` + +```js +toCamelCase("some_database_field_name") -> 'someDatabaseFieldName' +toCamelCase("Some label that needs to be camelized") -> 'someLabelThatNeedsToBeCamelized' +toCamelCase("some-javascript-property") -> 'someJavascriptProperty' +toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") -> 'someMixedStringWithSpacesUnderscoresAndHyphens' ``` [⬆ back to top](#table-of-contents) @@ -2109,11 +2419,14 @@ const toKebabCase = str => str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) .map(x => x.toLowerCase()) .join('-'); -// toKebabCase("camelCase") -> 'camel-case' -// toKebabCase("some text") -> 'some-text' -// toKebabCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some-mixed-string-with-spaces-underscores-and-hyphens' -// toKebabCase("AllThe-small Things") -> "all-the-small-things" -// toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-xml-and-html" +``` + +```js +toKebabCase("camelCase") -> 'camel-case' +toKebabCase("some text") -> 'some-text' +toKebabCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some-mixed-string-with-spaces-underscores-and-hyphens' +toKebabCase("AllThe-small Things") -> "all-the-small-things" +toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-xml-and-html" ``` [⬆ back to top](#table-of-contents) @@ -2130,13 +2443,15 @@ const toSnakeCase = str => { str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) .map(x => x.toLowerCase()) .join('_'); -}; -// toSnakeCase("camelCase") -> 'camel_case' -// toSnakeCase("some text") -> 'some_text' -// toSnakeCase("some-javascript-property") -> 'some_javascript_property' -// toSnakeCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some_mixed_string_with_spaces_underscores_and_hyphens' -// toSnakeCase("AllThe-small Things") -> "all_the_small_things" -// toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html" +``` + +```js +toSnakeCase("camelCase") -> 'camel_case' +toSnakeCase("some text") -> 'some_text' +toSnakeCase("some-javascript-property") -> 'some_javascript_property' +toSnakeCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some_mixed_string_with_spaces_underscores_and_hyphens' +toSnakeCase("AllThe-small Things") -> "all_the_smal_things" +toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html" ``` [⬆ back to top](#table-of-contents) @@ -2151,7 +2466,10 @@ Return the string truncated to the desired length, with `...` appended to the en ```js const truncateString = (str, num) => str.length > num ? str.slice(0, num > 3 ? num - 3 : num) + '...' : str; -// truncateString('boomerang', 7) -> 'boom...' +``` + +```js +truncateString('boomerang', 7) -> 'boom...' ``` [⬆ back to top](#table-of-contents) @@ -2165,8 +2483,11 @@ Omit the second argument to use the default regex. ```js const words = (str, pattern = /[^a-zA-Z-]+/) => str.split(pattern).filter(Boolean); -// words("I love javaScript!!") -> ["I", "love", "javaScript"] -// words("python, javaScript & coffee") -> ["python", "javaScript", "coffee"] +``` + +```js +words("I love javaScript!!") -> ["I", "love", "javaScript"] +words("python, javaScript & coffee") -> ["python", "javaScript", "coffee"] ``` [⬆ back to top](#table-of-contents) @@ -2179,8 +2500,11 @@ Returns the first non-null/undefined argument. Use `Array.find()` to return the first non `null`/`undefined` argument. ```js -const coalesce = (...args) => args.find(_ => ![undefined, null].includes(_)); -// coalesce(null,undefined,"",NaN, "Waldo") -> "" +const coalesce = (...args) => args.find(_ => ![undefined, null].includes(_)) +``` + +```js +coalesce(null,undefined,"",NaN, "Waldo") -> "" ``` [⬆ back to top](#table-of-contents) @@ -2193,8 +2517,11 @@ Use `Array.find()` to return the first argument that returns `true` from the pro ```js const coalesceFactory = valid => (...args) => args.find(valid); -// const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_)) -// customCoalesce(undefined, null, NaN, "", "Waldo") //-> "Waldo" +``` + +```js +const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_)) +customCoalesce(undefined, null, NaN, "", "Waldo") // "Waldo" ``` [⬆ back to top](#table-of-contents) @@ -2207,9 +2534,12 @@ Use `Array.map()`, `split()` and `Array.join()` to join the mapped array for con `String.slice()` is used to remove `#` from string start since it's added once. ```js const extendHex = shortHex => - '#' + shortHex.slice(shortHex.startsWith('#') ? 1 : 0).split('').map(x => x + x).join(''); -// extendHex('#03f') -> '#0033ff' -// extendHex('05a') -> '#0055aa' + '#' + shortHex.slice(shortHex.startsWith('#') ? 1 : 0).split('').map(x => x+x).join('') +``` + +```js +extendHex('#03f') -> '#0033ff' +extendHex('05a') -> '#0055aa' ``` [⬆ back to top](#table-of-contents) @@ -2223,7 +2553,10 @@ Returns lowercased constructor name of value, "undefined" or "null" if value is ```js const getType = v => v === undefined ? 'undefined' : v === null ? 'null' : v.constructor.name.toLowerCase(); -// getType(new Set([1,2,3])) -> "set" +``` + +```js +getType(new Set([1,2,3])) -> "set" ``` [⬆ back to top](#table-of-contents) @@ -2246,9 +2579,12 @@ const hexToRGB = hex => { ((h & (alpha ? 0x0000ff00 : 0x0000ff)) >>> (alpha ? 8 : 0)) + (alpha ? `, ${(h & 0x000000ff)}` : '') + ')'; }; -// hexToRGB('#27ae60ff') -> 'rgba(39, 174, 96, 255)' -// hexToRGB('27ae60') -> 'rgb(39, 174, 96)' -// hexToRGB('#fff') -> 'rgb(255, 255, 255)' +``` + +```js +hexToRGB('#27ae60ff') -> 'rgba(39, 174, 96, 255)' +hexToRGB('27ae60') -> 'rgb(39, 174, 96)' +hexToRGB('#fff') -> 'rgb(255, 255, 255)' ``` [⬆ back to top](#table-of-contents) @@ -2261,8 +2597,11 @@ Use `Array.isArray()` to check if a value is classified as an array. ```js const isArray = val => !!val && Array.isArray(val); -// isArray(null) -> false -// isArray([1]) -> true +``` + +```js +isArray(null) -> false +isArray([1]) -> true ``` [⬆ back to top](#table-of-contents) @@ -2275,8 +2614,11 @@ Use `typeof` to check if a value is classified as a boolean primitive. ```js const isBoolean = val => typeof val === 'boolean'; -// isBoolean(null) -> false -// isBoolean(false) -> true +``` + +```js +isBoolean(null) -> false +isBoolean(false) -> true ``` [⬆ back to top](#table-of-contents) @@ -2289,8 +2631,11 @@ Use `typeof` to check if a value is classified as a function primitive. ```js const isFunction = val => val && typeof val === 'function'; -// isFunction('x') -> false -// isFunction(x => x) -> true +``` + +```js +isFunction('x') -> false +isFunction(x => x) -> true ``` [⬆ back to top](#table-of-contents) @@ -2303,10 +2648,12 @@ Use `typeof` to check if a value is classified as a number primitive. ```js const isNumber = val => typeof val === 'number'; -// isNumber('1') -> false -// isNumber(1) -> true ``` +```js +isNumber('1') -> false +isNumber(1) -> true +``` [⬆ back to top](#table-of-contents) ### isString @@ -2317,8 +2664,11 @@ Use `typeof` to check if a value is classified as a string primitive. ```js const isString = val => typeof val === 'string'; -// isString(10) -> false -// isString('10') -> true +``` + +```js +isString(10) -> false +isString('10') -> true ``` [⬆ back to top](#table-of-contents) @@ -2331,8 +2681,11 @@ Use `typeof` to check if a value is classified as a symbol primitive. ```js const isSymbol = val => typeof val === 'symbol'; -// isSymbol('x') -> false -// isSymbol(Symbol('x')) -> true +``` + +```js +isSymbol('x') -> false +isSymbol(Symbol('x')) -> true ``` [⬆ back to top](#table-of-contents) @@ -2341,17 +2694,16 @@ const isSymbol = val => typeof val === 'symbol'; Generates a random hexadecimal color code. -Use `Math.random` to generate a random 24-bit(6x4bits) hexadecimal number. Use bit shifting and then convert it to an hexadecimal String using `toString(16)`. +Use `Math.random` to generate a random 24-bit(6x4bits) hexadecimal number. Use bit shifting and then convert it to an hexadecimal String using `toString(16)`. ```js -const randomHexColor = () => { - let n = (Math.random() * 0xfffff | 0).toString(16); - return '#' + (n.length !== 6 - ? (Math.random() * 0xf | 0).toString(16) + n : n); -}; -// randomHexColorCode() -> "#e34155" -// randomHexColorCode() -> "#fd73a6" -// randomHexColorCode() -> "#4144c6" +const randomHexColorCode = () => '#'+(Math.random()*0xFFFFFF<<0).toString(16); +``` + +```js +randomHexColorCode() -> "#e34155" +randomHexColorCode() -> "#fd73a6" +randomHexColorCode() -> "#4144c6" ``` [⬆ back to top](#table-of-contents) @@ -2364,7 +2716,10 @@ Convert given RGB parameters to hexadecimal string using bitwise left-shift oper ```js const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0'); -// RGBToHex(255, 165, 1) -> 'ffa501' +``` + +```js +RGBToHex(255, 165, 1) -> 'ffa501' ``` [⬆ back to top](#table-of-contents) @@ -2380,8 +2735,11 @@ const timeTaken = callback => { console.time('timeTaken'); const r = callback(); console.timeEnd('timeTaken'); return r; }; -// timeTaken(() => Math.pow(2, 10)) -> 1024 -// (logged): timeTaken: 0.02099609375ms +``` + +```js +timeTaken(() => Math.pow(2, 10)) -> 1024 +(logged): timeTaken: 0.02099609375ms ``` [⬆ back to top](#table-of-contents) @@ -2391,8 +2749,11 @@ const timeTaken = callback => { Use `toLocaleString()` to convert a float-point arithmetic to the [Decimal mark](https://en.wikipedia.org/wiki/Decimal_mark) form. It makes a comma separated string from a number. ```js -const toDecimalMark = num => num.toLocaleString('en-US'); -// toDecimalMark(12305030388.9087) -> "12,305,030,388.9087" +const toDecimalMark = num => num.toLocaleString("en-US"); +``` + +```js +toDecimalMark(12305030388.9087) -> "12,305,030,388.9087" ``` [⬆ back to top](#table-of-contents) @@ -2412,7 +2773,10 @@ const toOrdinalSuffix = num => { tPattern = [11, 12, 13, 14, 15, 16, 17, 18, 19]; return oPattern.includes(digits[0]) && !tPattern.includes(digits[1]) ? int + ordinals[digits[0] - 1] : int + ordinals[3]; }; -// toOrdinalSuffix("123") -> "123rd" +``` + +```js +toOrdinalSuffix("123") -> "123rd" ``` [⬆ back to top](#table-of-contents) @@ -2428,7 +2792,10 @@ const UUIDGenerator = () => ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) ); -// UUIDGenerator() -> '7982fcfe-5721-4632-bede-6000885be57d' +``` + +```js +UUIDGenerator() -> '7982fcfe-5721-4632-bede-6000885be57d' ``` [⬆ back to top](#table-of-contents) @@ -2443,7 +2810,10 @@ Use `Number()` to check if the coercion holds. ```js const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n; -// validateNumber('10') -> true +``` + +```js +validateNumber('10') -> true ``` [⬆ back to top](#table-of-contents) @@ -2451,4 +2821,3 @@ const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == ## Credits *Icons made by [Smashicons](https://www.flaticon.com/authors/smashicons) from [www.flaticon.com](https://www.flaticon.com/) is licensed by [CC 3.0 BY](http://creativecommons.org/licenses/by/3.0/).* - From 82367b85da82460dede5d55aa50b14bb2b591f7d Mon Sep 17 00:00:00 2001 From: Angelos Chalaris Date: Wed, 27 Dec 2017 12:24:40 +0200 Subject: [PATCH 24/36] Updated query selector to match the proper pre elements --- static-parts/index-start.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static-parts/index-start.html b/static-parts/index-start.html index a0060d67e..0ecf1810d 100644 --- a/static-parts/index-start.html +++ b/static-parts/index-start.html @@ -33,7 +33,7 @@ }) } function clipboard() { - const snippets = document.querySelectorAll("pre"); + const snippets = document.querySelectorAll(":not(pre) + pre"); snippets.forEach(element => { const button = document.createElement("button"); button.innerHTML = "Copy to clipboard"; From 91d42064c881b67c8029bb717aac61cc9c5d9f4c Mon Sep 17 00:00:00 2001 From: Angelos Chalaris Date: Wed, 27 Dec 2017 13:03:11 +0200 Subject: [PATCH 25/36] Updated the flavor file to avoid a styling problem --- docs/mini/flavor.scss | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/mini/flavor.scss b/docs/mini/flavor.scss index 1ac2b1f8c..bed527130 100644 --- a/docs/mini/flavor.scss +++ b/docs/mini/flavor.scss @@ -114,7 +114,10 @@ code, pre, kbd, code *, pre *, kbd *, code[class*="language-"], pre[class*="lang font-family: 'Inconsolata', Menlo, Consolas, monospace !important; } code, kbd { font-size: 1em; } -code { transform: scale(1); } /* Deals with the issue described in #243 */ +code { + padding: 0; // Should make the first line's left padding the same as all other lines and avoid that annoying little step. + transform: scale(1); /* Deals with the issue described in #243 */ +} pre { font-size: 1rem; border: 0.0625rem solid var(--secondary-border-color); border-radius: var(--universal-border-radius);} .group{position:relative;margin-top:2em;margin-bottom:-1em} .search{font-size:14px;margin-top:-.1em;display:block;width:100%;border:none;border-bottom:1px solid var(--nav-link-color)} From bb722b2eb417743db829ccba0dea93354af2b7f2 Mon Sep 17 00:00:00 2001 From: Angelos Chalaris Date: Wed, 27 Dec 2017 16:06:16 +0200 Subject: [PATCH 26/36] Updated examples --- snippets/JSONToDate.md | 2 +- snippets/RGBToHex.md | 2 +- snippets/UUIDGenerator.md | 2 +- snippets/anagrams.md | 2 +- snippets/arrayAverage.md | 2 +- snippets/arrayGcd.md | 4 ++-- snippets/arrayLcm.md | 4 ++-- snippets/arrayMax.md | 2 +- snippets/arrayMin.md | 2 +- snippets/arraySum.md | 2 +- snippets/bottomVisible.md | 2 +- snippets/capitalize.md | 4 ++-- snippets/capitalizeEveryWord.md | 2 +- snippets/chunk.md | 2 +- snippets/collatz.md | 4 ++-- snippets/compact.md | 2 +- snippets/compose.md | 2 +- snippets/countOccurrences.md | 2 +- snippets/countVowels.md | 4 ++-- snippets/currentURL.md | 2 +- snippets/curry.md | 4 ++-- snippets/deepFlatten.md | 2 +- snippets/difference.md | 2 +- snippets/distance.md | 2 +- snippets/distinctValuesOfArray.md | 2 +- snippets/dropElements.md | 2 +- snippets/elementIsVisibleInViewport.md | 4 ++-- snippets/escapeRegExp.md | 2 +- snippets/everyNth.md | 2 +- snippets/factorial.md | 2 +- snippets/fibonacci.md | 2 +- snippets/fibonacciCountUntilNum.md | 2 +- snippets/filterNonUnique.md | 2 +- snippets/flattenDepth.md | 2 +- snippets/fromCamelCase.md | 6 +++--- snippets/functionName.md | 2 +- snippets/gcd.md | 2 +- snippets/getDaysDiffBetweenDates.md | 2 +- snippets/getScrollPosition.md | 2 +- snippets/getType.md | 2 +- snippets/getURLParameters.md | 2 +- snippets/groupBy.md | 4 ++-- snippets/hammingDistance.md | 2 +- snippets/head.md | 2 +- snippets/initial.md | 2 +- snippets/initialize2DArray.md | 2 +- snippets/initializeArrayWithRange.md | 4 ++-- snippets/initializeArrayWithValues.md | 2 +- snippets/intersection.md | 2 +- snippets/isArray.md | 4 ++-- snippets/isBoolean.md | 4 ++-- snippets/isDivisible.md | 2 +- snippets/isEven.md | 2 +- snippets/isFunction.md | 4 ++-- snippets/isNumber.md | 4 ++-- snippets/isPrime.md | 4 ++-- snippets/isString.md | 4 ++-- snippets/isSymbol.md | 4 ++-- snippets/last.md | 2 +- snippets/lcm.md | 2 +- snippets/median.md | 4 ++-- snippets/negate.md | 4 ++-- snippets/objectFromPairs.md | 2 +- snippets/objectToPairs.md | 2 +- snippets/orderBy.md | 4 ++-- snippets/palindrome.md | 2 +- snippets/percentile.md | 2 +- snippets/pick.md | 2 +- snippets/pipeFunctions.md | 2 +- snippets/powerset.md | 2 +- snippets/promisify.md | 2 +- snippets/pull.md | 4 ++-- snippets/randomHexColorCode.md | 15 +++++++++++++++ snippets/randomIntegerInRange.md | 2 +- snippets/randomNumberInRange.md | 2 +- snippets/remove.md | 2 +- snippets/reverseString.md | 2 +- snippets/runPromisesInSeries.md | 2 +- snippets/sample.md | 2 +- snippets/select.md | 2 +- snippets/shallowClone.md | 2 +- snippets/similarity.md | 2 +- snippets/sortCharactersInString.md | 2 +- snippets/speechSynthesis.md | 2 +- snippets/spreadOver.md | 4 ++-- snippets/standardDeviation.md | 4 ++-- snippets/symmetricDifference.md | 2 +- snippets/tail.md | 4 ++-- snippets/take.md | 4 ++-- snippets/takeRight.md | 4 ++-- snippets/timeTaken.md | 2 +- snippets/toCamelCase.md | 8 ++++---- snippets/toKebabCase.md | 10 +++++----- snippets/toOrdinalSuffix.md | 2 +- snippets/toSnakeCase.md | 12 ++++++------ snippets/truncateString.md | 2 +- snippets/truthCheckCollection.md | 2 +- snippets/union.md | 2 +- snippets/validateNumber.md | 2 +- snippets/without.md | 2 +- snippets/words.md | 4 ++-- 101 files changed, 155 insertions(+), 140 deletions(-) create mode 100644 snippets/randomHexColorCode.md diff --git a/snippets/JSONToDate.md b/snippets/JSONToDate.md index 9217b3de3..8017eba98 100644 --- a/snippets/JSONToDate.md +++ b/snippets/JSONToDate.md @@ -12,5 +12,5 @@ const JSONToDate = arr => { ``` ```js -JSONToDate(/Date(1489525200000)/) -> "14/3/2017" +JSONToDate(/Date(1489525200000)/) // "14/3/2017" ``` diff --git a/snippets/RGBToHex.md b/snippets/RGBToHex.md index f7568f70f..a7f045ab7 100644 --- a/snippets/RGBToHex.md +++ b/snippets/RGBToHex.md @@ -9,5 +9,5 @@ const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6 ``` ```js -RGBToHex(255, 165, 1) -> 'ffa501' +RGBToHex(255, 165, 1) // 'ffa501' ``` diff --git a/snippets/UUIDGenerator.md b/snippets/UUIDGenerator.md index 87300e5ed..2fc772940 100644 --- a/snippets/UUIDGenerator.md +++ b/snippets/UUIDGenerator.md @@ -12,5 +12,5 @@ const UUIDGenerator = () => ``` ```js -UUIDGenerator() -> '7982fcfe-5721-4632-bede-6000885be57d' +UUIDGenerator() // '7982fcfe-5721-4632-bede-6000885be57d' ``` diff --git a/snippets/anagrams.md b/snippets/anagrams.md index 2238c4a5f..82684871c 100644 --- a/snippets/anagrams.md +++ b/snippets/anagrams.md @@ -16,5 +16,5 @@ const anagrams = str => { ``` ```js -anagrams('abc') -> ['abc','acb','bac','bca','cab','cba'] +anagrams('abc') // ['abc','acb','bac','bca','cab','cba'] ``` diff --git a/snippets/arrayAverage.md b/snippets/arrayAverage.md index 92c54518b..1cc3cecb4 100644 --- a/snippets/arrayAverage.md +++ b/snippets/arrayAverage.md @@ -9,5 +9,5 @@ const arrayAverage = arr => arr.reduce((acc, val) => acc + val, 0) / arr.length; ``` ```js -arrayAverage([1,2,3]) -> 2 +arrayAverage([1,2,3]) // 2 ``` diff --git a/snippets/arrayGcd.md b/snippets/arrayGcd.md index 364b18792..83e577761 100644 --- a/snippets/arrayGcd.md +++ b/snippets/arrayGcd.md @@ -12,6 +12,6 @@ const arrayGcd = arr => { ``` ```js -arrayGcd([1,2,3,4,5]) -> 1 -arrayGcd([4,8,12]) -> 4 +arrayGcd([1,2,3,4,5]) // 1 +arrayGcd([4,8,12]) // 4 ``` diff --git a/snippets/arrayLcm.md b/snippets/arrayLcm.md index f77797c4c..f39d0f3dc 100644 --- a/snippets/arrayLcm.md +++ b/snippets/arrayLcm.md @@ -13,6 +13,6 @@ const arrayLcm = arr => { ``` ```js -arrayLcm([1,2,3,4,5]) -> 60 -arrayLcm([4,8,12]) -> 24 +arrayLcm([1,2,3,4,5]) // 60 +arrayLcm([4,8,12]) // 24 ``` diff --git a/snippets/arrayMax.md b/snippets/arrayMax.md index 3e1b5c5e8..32178d533 100644 --- a/snippets/arrayMax.md +++ b/snippets/arrayMax.md @@ -9,5 +9,5 @@ const arrayMax = arr => Math.max(...arr); ``` ```js -arrayMax([10, 1, 5]) -> 10 +arrayMax([10, 1, 5]) // 10 ``` diff --git a/snippets/arrayMin.md b/snippets/arrayMin.md index 171d60977..1e256b388 100644 --- a/snippets/arrayMin.md +++ b/snippets/arrayMin.md @@ -9,5 +9,5 @@ const arrayMin = arr => Math.min(...arr); ``` ```js -arrayMin([10, 1, 5]) -> 1 +arrayMin([10, 1, 5]) // 1 ``` diff --git a/snippets/arraySum.md b/snippets/arraySum.md index 9c3178d35..536a4eb81 100644 --- a/snippets/arraySum.md +++ b/snippets/arraySum.md @@ -9,5 +9,5 @@ const arraySum = arr => arr.reduce((acc, val) => acc + val, 0); ``` ```js -arraySum([1,2,3,4]) -> 10 +arraySum([1,2,3,4]) // 10 ``` diff --git a/snippets/bottomVisible.md b/snippets/bottomVisible.md index 485f1879f..844d11b31 100644 --- a/snippets/bottomVisible.md +++ b/snippets/bottomVisible.md @@ -10,5 +10,5 @@ const bottomVisible = () => ``` ```js -// bottomVisible() -> true +// bottomVisible() // true ``` diff --git a/snippets/capitalize.md b/snippets/capitalize.md index 671b27191..ea1c56124 100644 --- a/snippets/capitalize.md +++ b/snippets/capitalize.md @@ -11,6 +11,6 @@ const capitalize = ([first, ...rest], lowerRest = false) => ``` ```js -capitalize('fooBar') -> 'FooBar' -capitalize('fooBar', true) -> 'Foobar' +capitalize('fooBar') // 'FooBar' +capitalize('fooBar', true) // 'Foobar' ``` diff --git a/snippets/capitalizeEveryWord.md b/snippets/capitalizeEveryWord.md index b607f8f58..dd3193c3e 100644 --- a/snippets/capitalizeEveryWord.md +++ b/snippets/capitalizeEveryWord.md @@ -9,5 +9,5 @@ const capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperC ``` ```js -capitalizeEveryWord('hello world!') -> 'Hello World!' +capitalizeEveryWord('hello world!') // 'Hello World!' ``` diff --git a/snippets/chunk.md b/snippets/chunk.md index 122712351..f27fe965c 100644 --- a/snippets/chunk.md +++ b/snippets/chunk.md @@ -12,5 +12,5 @@ const chunk = (arr, size) => ``` ```js -chunk([1,2,3,4,5], 2) -> [[1,2],[3,4],[5]] +chunk([1,2,3,4,5], 2) // [[1,2],[3,4],[5]] ``` diff --git a/snippets/collatz.md b/snippets/collatz.md index fc05b2a5d..de67f674c 100644 --- a/snippets/collatz.md +++ b/snippets/collatz.md @@ -9,6 +9,6 @@ const collatz = n => (n % 2 == 0) ? (n / 2) : (3 * n + 1); ``` ```js -collatz(8) -> 4 -collatz(5) -> 16 +collatz(8) // 4 +collatz(5) // 16 ``` diff --git a/snippets/compact.md b/snippets/compact.md index 2a9528772..07f4e9900 100644 --- a/snippets/compact.md +++ b/snippets/compact.md @@ -9,5 +9,5 @@ const compact = arr => arr.filter(Boolean); ``` ```js -compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) -> [ 1, 2, 3, 'a', 's', 34 ] +compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) // [ 1, 2, 3, 'a', 's', 34 ] ``` diff --git a/snippets/compose.md b/snippets/compose.md index dfd40f814..c271a50e8 100644 --- a/snippets/compose.md +++ b/snippets/compose.md @@ -13,5 +13,5 @@ const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args))); const add5 = x => x + 5 const multiply = (x, y) => x * y const multiplyAndAdd5 = compose(add5, multiply) -multiplyAndAdd5(5, 2) -> 15 +multiplyAndAdd5(5, 2) // 15 ``` diff --git a/snippets/countOccurrences.md b/snippets/countOccurrences.md index 2c1463b02..d68c83acf 100644 --- a/snippets/countOccurrences.md +++ b/snippets/countOccurrences.md @@ -9,5 +9,5 @@ const countOccurrences = (arr, value) => arr.reduce((a, v) => v === value ? a + ``` ```js -countOccurrences([1,1,2,1,2,3], 1) -> 3 +countOccurrences([1,1,2,1,2,3], 1) // 3 ``` diff --git a/snippets/countVowels.md b/snippets/countVowels.md index 47c683eb8..50cf6cafa 100644 --- a/snippets/countVowels.md +++ b/snippets/countVowels.md @@ -9,6 +9,6 @@ const countVowels = str => (str.match(/[aeiou]/ig) || []).length; ``` ```js -countVowels('foobar') -> 3 -countVowels('gym') -> 0 +countVowels('foobar') // 3 +countVowels('gym') // 0 ``` diff --git a/snippets/currentURL.md b/snippets/currentURL.md index 7e8965d92..0fab76ab3 100644 --- a/snippets/currentURL.md +++ b/snippets/currentURL.md @@ -9,5 +9,5 @@ const currentURL = () => window.location.href; ``` ```js -currentUrl() -> 'https://google.com' +currentUrl() // 'https://google.com' ``` diff --git a/snippets/curry.md b/snippets/curry.md index f1806d395..c316acff2 100644 --- a/snippets/curry.md +++ b/snippets/curry.md @@ -15,6 +15,6 @@ const curry = (fn, arity = fn.length, ...args) => ``` ```js -curry(Math.pow)(2)(10) -> 1024 -curry(Math.min, 3)(10)(50)(2) -> 2 +curry(Math.pow)(2)(10) // 1024 +curry(Math.min, 3)(10)(50)(2) // 2 ``` diff --git a/snippets/deepFlatten.md b/snippets/deepFlatten.md index cea888992..c6c9d2807 100644 --- a/snippets/deepFlatten.md +++ b/snippets/deepFlatten.md @@ -11,5 +11,5 @@ const deepFlatten = arr => [].concat(...arr.map(v => Array.isArray(v) ? deepFlat ``` ```js -deepFlatten([1,[2],[[3],4],5]) -> [1,2,3,4,5] +deepFlatten([1,[2],[[3],4],5]) // [1,2,3,4,5] ``` diff --git a/snippets/difference.md b/snippets/difference.md index dce891e60..486d4b050 100644 --- a/snippets/difference.md +++ b/snippets/difference.md @@ -9,5 +9,5 @@ const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has ``` ```js -difference([1,2,3], [1,2,4]) -> [3] +difference([1,2,3], [1,2,4]) // [3] ``` diff --git a/snippets/distance.md b/snippets/distance.md index 543c763a6..bfc29b8dc 100644 --- a/snippets/distance.md +++ b/snippets/distance.md @@ -9,5 +9,5 @@ const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0); ``` ```js -distance(1,1, 2,3) -> 2.23606797749979 +distance(1,1, 2,3) // 2.23606797749979 ``` diff --git a/snippets/distinctValuesOfArray.md b/snippets/distinctValuesOfArray.md index 374e24cef..509738a40 100644 --- a/snippets/distinctValuesOfArray.md +++ b/snippets/distinctValuesOfArray.md @@ -9,5 +9,5 @@ const distinctValuesOfArray = arr => [...new Set(arr)]; ``` ```js -distinctValuesOfArray([1,2,2,3,4,4,5]) -> [1,2,3,4,5] +distinctValuesOfArray([1,2,2,3,4,4,5]) // [1,2,3,4,5] ``` diff --git a/snippets/dropElements.md b/snippets/dropElements.md index 064a16d22..a9632c634 100644 --- a/snippets/dropElements.md +++ b/snippets/dropElements.md @@ -13,5 +13,5 @@ const dropElements = (arr, func) => { ``` ```js -dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4] +dropElements([1, 2, 3, 4], n => n >= 3) // [3,4] ``` diff --git a/snippets/elementIsVisibleInViewport.md b/snippets/elementIsVisibleInViewport.md index 83e6afe71..ed2933efe 100644 --- a/snippets/elementIsVisibleInViewport.md +++ b/snippets/elementIsVisibleInViewport.md @@ -20,6 +20,6 @@ const elementIsVisibleInViewport = (el, partiallyVisible = false) => { ```js // e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10} -elementIsVisibleInViewport(el) -> false // (not fully visible) -elementIsVisibleInViewport(el, true) -> true // (partially visible) +elementIsVisibleInViewport(el) // false // (not fully visible) +elementIsVisibleInViewport(el, true) // true // (partially visible) ``` diff --git a/snippets/escapeRegExp.md b/snippets/escapeRegExp.md index 7fdbff462..f82850d2b 100644 --- a/snippets/escapeRegExp.md +++ b/snippets/escapeRegExp.md @@ -9,5 +9,5 @@ const escapeRegExp = str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); ``` ```js -escapeRegExp('(test)') -> \\(test\\) +escapeRegExp('(test)') // \\(test\\) ``` diff --git a/snippets/everyNth.md b/snippets/everyNth.md index 6aa78ac69..2fab65d47 100644 --- a/snippets/everyNth.md +++ b/snippets/everyNth.md @@ -9,5 +9,5 @@ const everyNth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1); ``` ```js -everyNth([1,2,3,4,5,6], 2) -> [ 2, 4, 6 ] +everyNth([1,2,3,4,5,6], 2) // [ 2, 4, 6 ] ``` diff --git a/snippets/factorial.md b/snippets/factorial.md index de604f52c..5f76f06d3 100644 --- a/snippets/factorial.md +++ b/snippets/factorial.md @@ -14,5 +14,5 @@ const factorial = n => ``` ```js -factorial(6) -> 720 +factorial(6) // 720 ``` diff --git a/snippets/fibonacci.md b/snippets/fibonacci.md index 9addac34a..474bba30d 100644 --- a/snippets/fibonacci.md +++ b/snippets/fibonacci.md @@ -11,5 +11,5 @@ const fibonacci = n => ``` ```js -factorial(6) -> 720 +factorial(6) // 720 ``` diff --git a/snippets/fibonacciCountUntilNum.md b/snippets/fibonacciCountUntilNum.md index 82f53ea98..719e8cef3 100644 --- a/snippets/fibonacciCountUntilNum.md +++ b/snippets/fibonacciCountUntilNum.md @@ -10,5 +10,5 @@ const fibonacciCountUntilNum = num => ``` ```js -fibonacciCountUntilNum(10) -> 7 +fibonacciCountUntilNum(10) // 7 ``` diff --git a/snippets/filterNonUnique.md b/snippets/filterNonUnique.md index 1568afbf8..cfce97f56 100644 --- a/snippets/filterNonUnique.md +++ b/snippets/filterNonUnique.md @@ -9,5 +9,5 @@ const filterNonUnique = arr => arr.filter(i => arr.indexOf(i) === arr.lastIndexO ``` ```js -filterNonUnique([1,2,2,3,4,4,5]) -> [1,3,5] +filterNonUnique([1,2,2,3,4,4,5]) // [1,3,5] ``` diff --git a/snippets/flattenDepth.md b/snippets/flattenDepth.md index 6034b9135..a08563ca5 100644 --- a/snippets/flattenDepth.md +++ b/snippets/flattenDepth.md @@ -14,5 +14,5 @@ const flattenDepth = (arr, depth = 1) => ``` ```js -flatten([1,[2],3,4]) -> [1,2,3,4] +flatten([1,[2],3,4]) // [1,2,3,4] ``` diff --git a/snippets/fromCamelCase.md b/snippets/fromCamelCase.md index 14c21bc4c..9a74226f7 100644 --- a/snippets/fromCamelCase.md +++ b/snippets/fromCamelCase.md @@ -12,7 +12,7 @@ const fromCamelCase = (str, separator = '_') => ``` ```js -fromCamelCase('someDatabaseFieldName', ' ') -> 'some database field name' -fromCamelCase('someLabelThatNeedsToBeCamelized', '-') -> 'some-label-that-needs-to-be-camelized' -fromCamelCase('someJavascriptProperty', '_') -> 'some_javascript_property' +fromCamelCase('someDatabaseFieldName', ' ') // 'some database field name' +fromCamelCase('someLabelThatNeedsToBeCamelized', '-') // 'some-label-that-needs-to-be-camelized' +fromCamelCase('someJavascriptProperty', '_') // 'some_javascript_property' ``` diff --git a/snippets/functionName.md b/snippets/functionName.md index 1ad25772a..17869a6a6 100644 --- a/snippets/functionName.md +++ b/snippets/functionName.md @@ -9,5 +9,5 @@ const functionName = fn => (console.debug(fn.name), fn); ``` ```js -functionName(Math.max) -> max (logged in debug channel of console) +functionName(Math.max) // max (logged in debug channel of console) ``` diff --git a/snippets/gcd.md b/snippets/gcd.md index 8affada12..f3faa5057 100644 --- a/snippets/gcd.md +++ b/snippets/gcd.md @@ -11,5 +11,5 @@ const gcd = (x, y) => !y ? x : gcd(y, x % y); ``` ```js -gcd (8, 36) -> 4 +gcd (8, 36) // 4 ``` diff --git a/snippets/getDaysDiffBetweenDates.md b/snippets/getDaysDiffBetweenDates.md index 6c73366ac..f0f4d5763 100644 --- a/snippets/getDaysDiffBetweenDates.md +++ b/snippets/getDaysDiffBetweenDates.md @@ -9,5 +9,5 @@ const getDaysDiffBetweenDates = (dateInitial, dateFinal) => (dateFinal - dateIni ``` ```js -getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) -> 9 +getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) // 9 ``` diff --git a/snippets/getScrollPosition.md b/snippets/getScrollPosition.md index 2708210a1..4860b0293 100644 --- a/snippets/getScrollPosition.md +++ b/snippets/getScrollPosition.md @@ -12,5 +12,5 @@ const getScrollPosition = (el = window) => ``` ```js -getScrollPosition() -> {x: 0, y: 200} +getScrollPosition() // {x: 0, y: 200} ``` diff --git a/snippets/getType.md b/snippets/getType.md index f0b9be8d5..655f62adb 100644 --- a/snippets/getType.md +++ b/snippets/getType.md @@ -10,5 +10,5 @@ const getType = v => ``` ```js -getType(new Set([1,2,3])) -> "set" +getType(new Set([1,2,3])) // "set" ``` diff --git a/snippets/getURLParameters.md b/snippets/getURLParameters.md index 5f4690bfc..b1e138450 100644 --- a/snippets/getURLParameters.md +++ b/snippets/getURLParameters.md @@ -13,5 +13,5 @@ const getURLParameters = url => ``` ```js -getURLParameters('http://url.com/page?name=Adam&surname=Smith') -> {name: 'Adam', surname: 'Smith'} +getURLParameters('http://url.com/page?name=Adam&surname=Smith') // {name: 'Adam', surname: 'Smith'} ``` diff --git a/snippets/groupBy.md b/snippets/groupBy.md index 4b301e2b8..bebea215c 100644 --- a/snippets/groupBy.md +++ b/snippets/groupBy.md @@ -12,6 +12,6 @@ const groupBy = (arr, func) => ``` ```js -groupBy([6.1, 4.2, 6.3], Math.floor) -> {4: [4.2], 6: [6.1, 6.3]} -groupBy(['one', 'two', 'three'], 'length') -> {3: ['one', 'two'], 5: ['three']} +groupBy([6.1, 4.2, 6.3], Math.floor) // {4: [4.2], 6: [6.1, 6.3]} +groupBy(['one', 'two', 'three'], 'length') // {3: ['one', 'two'], 5: ['three']} ``` diff --git a/snippets/hammingDistance.md b/snippets/hammingDistance.md index e0f22dba7..aedc72ce8 100644 --- a/snippets/hammingDistance.md +++ b/snippets/hammingDistance.md @@ -11,5 +11,5 @@ const hammingDistance = (num1, num2) => ``` ```js -hammingDistance(2,3) -> 1 +hammingDistance(2,3) // 1 ``` diff --git a/snippets/head.md b/snippets/head.md index 30b8951a6..b48d9bb1d 100644 --- a/snippets/head.md +++ b/snippets/head.md @@ -9,5 +9,5 @@ const head = arr => arr[0]; ``` ```js -head([1,2,3]) -> 1 +head([1,2,3]) // 1 ``` diff --git a/snippets/initial.md b/snippets/initial.md index 87827c437..be178bcc8 100644 --- a/snippets/initial.md +++ b/snippets/initial.md @@ -9,5 +9,5 @@ const initial = arr => arr.slice(0, -1); ``` ```js -initial([1,2,3]) -> [1,2] +initial([1,2,3]) // [1,2] ``` diff --git a/snippets/initialize2DArray.md b/snippets/initialize2DArray.md index add743115..bde4ba879 100644 --- a/snippets/initialize2DArray.md +++ b/snippets/initialize2DArray.md @@ -9,5 +9,5 @@ const initialize2DArray = (w, h, val = null) => Array(h).fill().map(() => Array( ``` ```js -initialize2DArray(2, 2, 0) -> [[0,0], [0,0]] +initialize2DArray(2, 2, 0) // [[0,0], [0,0]] ``` diff --git a/snippets/initializeArrayWithRange.md b/snippets/initializeArrayWithRange.md index 8ea87a9c4..9c3b0c8f4 100644 --- a/snippets/initializeArrayWithRange.md +++ b/snippets/initializeArrayWithRange.md @@ -11,6 +11,6 @@ const initializeArrayWithRange = (end, start = 0) => ``` ```js -initializeArrayWithRange(5) -> [0,1,2,3,4,5] -initializeArrayWithRange(7, 3) -> [3,4,5,6,7] +initializeArrayWithRange(5) // [0,1,2,3,4,5] +initializeArrayWithRange(7, 3) // [3,4,5,6,7] ``` diff --git a/snippets/initializeArrayWithValues.md b/snippets/initializeArrayWithValues.md index a92a09e7a..a8ac57bc5 100644 --- a/snippets/initializeArrayWithValues.md +++ b/snippets/initializeArrayWithValues.md @@ -10,5 +10,5 @@ const initializeArrayWithValues = (n, value = 0) => Array(n).fill(value); ``` ```js -initializeArrayWithValues(5, 2) -> [2,2,2,2,2] +initializeArrayWithValues(5, 2) // [2,2,2,2,2] ``` diff --git a/snippets/intersection.md b/snippets/intersection.md index 0596a04ce..960433b6e 100644 --- a/snippets/intersection.md +++ b/snippets/intersection.md @@ -9,5 +9,5 @@ const intersection = (a, b) => { const s = new Set(b); return a.filter(x => s.ha ``` ```js -intersection([1,2,3], [4,3,2]) -> [2,3] +intersection([1,2,3], [4,3,2]) // [2,3] ``` diff --git a/snippets/isArray.md b/snippets/isArray.md index 28b80c262..3fa987f4f 100644 --- a/snippets/isArray.md +++ b/snippets/isArray.md @@ -9,6 +9,6 @@ const isArray = val => !!val && Array.isArray(val); ``` ```js -isArray(null) -> false -isArray([1]) -> true +isArray(null) // false +isArray([1]) // true ``` diff --git a/snippets/isBoolean.md b/snippets/isBoolean.md index ad47fa33e..3e7022df9 100644 --- a/snippets/isBoolean.md +++ b/snippets/isBoolean.md @@ -9,6 +9,6 @@ const isBoolean = val => typeof val === 'boolean'; ``` ```js -isBoolean(null) -> false -isBoolean(false) -> true +isBoolean(null) // false +isBoolean(false) // true ``` diff --git a/snippets/isDivisible.md b/snippets/isDivisible.md index 95919d69d..b7a5614f0 100644 --- a/snippets/isDivisible.md +++ b/snippets/isDivisible.md @@ -9,5 +9,5 @@ const isDivisible = (dividend, divisor) => dividend % divisor === 0; ``` ```js -isDivisible(6,3) -> true +isDivisible(6,3) // true ``` diff --git a/snippets/isEven.md b/snippets/isEven.md index b2bb58b58..2e3312309 100644 --- a/snippets/isEven.md +++ b/snippets/isEven.md @@ -10,5 +10,5 @@ const isEven = num => num % 2 === 0; ``` ```js -isEven(3) -> false +isEven(3) // false ``` diff --git a/snippets/isFunction.md b/snippets/isFunction.md index eae2073e4..d1c0a722d 100644 --- a/snippets/isFunction.md +++ b/snippets/isFunction.md @@ -9,6 +9,6 @@ const isFunction = val => val && typeof val === 'function'; ``` ```js -isFunction('x') -> false -isFunction(x => x) -> true +isFunction('x') // false +isFunction(x => x) // true ``` diff --git a/snippets/isNumber.md b/snippets/isNumber.md index 3035a0a3a..f14a608e5 100644 --- a/snippets/isNumber.md +++ b/snippets/isNumber.md @@ -9,6 +9,6 @@ const isNumber = val => typeof val === 'number'; ``` ```js -isNumber('1') -> false -isNumber(1) -> true +isNumber('1') // false +isNumber(1) // true ``` \ No newline at end of file diff --git a/snippets/isPrime.md b/snippets/isPrime.md index 2e609028b..b0d23c80e 100644 --- a/snippets/isPrime.md +++ b/snippets/isPrime.md @@ -14,6 +14,6 @@ const isPrime = num => { ``` ```js -isPrime(11) -> true -isPrime(12) -> false +isPrime(11) // true +isPrime(12) // false ``` diff --git a/snippets/isString.md b/snippets/isString.md index 923bcd174..1e0dbcef6 100644 --- a/snippets/isString.md +++ b/snippets/isString.md @@ -9,6 +9,6 @@ const isString = val => typeof val === 'string'; ``` ```js -isString(10) -> false -isString('10') -> true +isString(10) // false +isString('10') // true ``` diff --git a/snippets/isSymbol.md b/snippets/isSymbol.md index 0baa68500..a0ae667eb 100644 --- a/snippets/isSymbol.md +++ b/snippets/isSymbol.md @@ -9,6 +9,6 @@ const isSymbol = val => typeof val === 'symbol'; ``` ```js -isSymbol('x') -> false -isSymbol(Symbol('x')) -> true +isSymbol('x') // false +isSymbol(Symbol('x')) // true ``` diff --git a/snippets/last.md b/snippets/last.md index f26427591..3dd1cf680 100644 --- a/snippets/last.md +++ b/snippets/last.md @@ -9,5 +9,5 @@ const last = arr => arr[arr.length - 1]; ``` ```js -last([1,2,3]) -> 3 +last([1,2,3]) // 3 ``` diff --git a/snippets/lcm.md b/snippets/lcm.md index 43e65c12f..437f32a5d 100644 --- a/snippets/lcm.md +++ b/snippets/lcm.md @@ -13,5 +13,5 @@ const lcm = (x, y) => { ``` ```js -lcm(12,7) -> 84 +lcm(12,7) // 84 ``` diff --git a/snippets/median.md b/snippets/median.md index e472e7c0d..77ec63fdf 100644 --- a/snippets/median.md +++ b/snippets/median.md @@ -13,6 +13,6 @@ const median = arr => { ``` ```js -median([5,6,50,1,-5]) -> 5 -median([0,10,-2,7]) -> 3.5 +median([5,6,50,1,-5]) // 5 +median([0,10,-2,7]) // 3.5 ``` diff --git a/snippets/negate.md b/snippets/negate.md index 739ad97c1..fd8856b2f 100644 --- a/snippets/negate.md +++ b/snippets/negate.md @@ -9,6 +9,6 @@ const negate = func => (...args) => !func(...args); ``` ```js -filter([1, 2, 3, 4, 5, 6], negate(isEven)) -> [1, 3, 5] -negate(isOdd)(1) -> false +filter([1, 2, 3, 4, 5, 6], negate(isEven)) // [1, 3, 5] +negate(isOdd)(1) // false ``` diff --git a/snippets/objectFromPairs.md b/snippets/objectFromPairs.md index 2ed208f44..5066ff528 100644 --- a/snippets/objectFromPairs.md +++ b/snippets/objectFromPairs.md @@ -9,5 +9,5 @@ const objectFromPairs = arr => arr.reduce((a, v) => (a[v[0]] = v[1], a), {}); ``` ```js -objectFromPairs([['a',1],['b',2]]) -> {a: 1, b: 2} +objectFromPairs([['a',1],['b',2]]) // {a: 1, b: 2} ``` diff --git a/snippets/objectToPairs.md b/snippets/objectToPairs.md index 6ea5fc051..6d73bc93b 100644 --- a/snippets/objectToPairs.md +++ b/snippets/objectToPairs.md @@ -9,5 +9,5 @@ const objectToPairs = obj => Object.keys(obj).map(k => [k, obj[k]]); ``` ```js -objectToPairs({a: 1, b: 2}) -> [['a',1],['b',2]]) +objectToPairs({a: 1, b: 2}) // [['a',1],['b',2]]) ``` diff --git a/snippets/orderBy.md b/snippets/orderBy.md index ab5581dc3..48c1d1172 100644 --- a/snippets/orderBy.md +++ b/snippets/orderBy.md @@ -21,6 +21,6 @@ const orderBy = (arr, props, orders) => ```js const users = [{ 'name': 'fred', 'age': 48 },{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 },{ 'name': 'barney', 'age': 34 }]; -orderby(users, ['name', 'age'], ['asc', 'desc']) -> [{name: 'barney', age: 36}, {name: 'barney', age: 34}, {name: 'fred', age: 48}, {name: 'fred', age: 40}] -orderby(users, ['name', 'age']) -> [{name: 'barney', age: 34}, {name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}] +orderby(users, ['name', 'age'], ['asc', 'desc']) // [{name: 'barney', age: 36}, {name: 'barney', age: 34}, {name: 'fred', age: 48}, {name: 'fred', age: 40}] +orderby(users, ['name', 'age']) // [{name: 'barney', age: 34}, {name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}] ``` diff --git a/snippets/palindrome.md b/snippets/palindrome.md index 820162617..f6c8f4204 100644 --- a/snippets/palindrome.md +++ b/snippets/palindrome.md @@ -13,5 +13,5 @@ const palindrome = str => { ``` ```js -palindrome('taco cat') -> true +palindrome('taco cat') // true ``` diff --git a/snippets/percentile.md b/snippets/percentile.md index 5287521b0..92a9d2eab 100644 --- a/snippets/percentile.md +++ b/snippets/percentile.md @@ -10,5 +10,5 @@ const percentile = (arr, val) => ``` ```js -percentile([1,2,3,4,5,6,7,8,9,10], 6) -> 55 +percentile([1,2,3,4,5,6,7,8,9,10], 6) // 55 ``` diff --git a/snippets/pick.md b/snippets/pick.md index 0bfeba286..f59ff2ba6 100644 --- a/snippets/pick.md +++ b/snippets/pick.md @@ -10,5 +10,5 @@ const pick = (obj, arr) => ``` ```js -pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) -> { 'a': 1, 'c': 3 } +pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) // { 'a': 1, 'c': 3 } ``` diff --git a/snippets/pipeFunctions.md b/snippets/pipeFunctions.md index 99970bae0..4b23ba8fd 100644 --- a/snippets/pipeFunctions.md +++ b/snippets/pipeFunctions.md @@ -13,5 +13,5 @@ const pipeFunctions = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args) const add5 = x => x + 5 const multiply = (x, y) => x * y const multiplyAndAdd5 = pipeFunctions(multiply, add5) -multiplyAndAdd5(5, 2) -> 15 +multiplyAndAdd5(5, 2) // 15 ``` diff --git a/snippets/powerset.md b/snippets/powerset.md index dc91406e9..3e1651174 100644 --- a/snippets/powerset.md +++ b/snippets/powerset.md @@ -10,5 +10,5 @@ const powerset = arr => ``` ```js -powerset([1,2]) -> [[], [1], [2], [2,1]] +powerset([1,2]) // [[], [1], [2], [2,1]] ``` diff --git a/snippets/promisify.md b/snippets/promisify.md index 4769fa5e9..f4a414cc1 100644 --- a/snippets/promisify.md +++ b/snippets/promisify.md @@ -18,5 +18,5 @@ const promisify = func => ```js const delay = promisify((d, cb) => setTimeout(cb, d)) -delay(2000).then(() => console.log('Hi!')) -> // Promise resolves after 2s +delay(2000).then(() => console.log('Hi!')) // // Promise resolves after 2s ``` diff --git a/snippets/pull.md b/snippets/pull.md index 52e0f3ea6..153732ffd 100644 --- a/snippets/pull.md +++ b/snippets/pull.md @@ -19,9 +19,9 @@ const pull = (arr, ...args) => { ```js let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c']; pull(myArray1, 'a', 'c'); -console.log(myArray1) -> [ 'b', 'b' ] +console.log(myArray1) // [ 'b', 'b' ] let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c']; pull(myArray2, ['a', 'c']); -console.log(myArray2) -> [ 'b', 'b' ] +console.log(myArray2) // [ 'b', 'b' ] ``` diff --git a/snippets/randomHexColorCode.md b/snippets/randomHexColorCode.md new file mode 100644 index 000000000..5009e1977 --- /dev/null +++ b/snippets/randomHexColorCode.md @@ -0,0 +1,15 @@ +### randomHexColorCode + +Generates a random hexadecimal color code. + +Use `Math.random` to generate a random 24-bit(6x4bits) hexadecimal number. Use bit shifting and then convert it to an hexadecimal String using `toString(16)`. + +```js +const randomHexColorCode = () => '#'+(Math.random()*0xFFFFFF<<0).toString(16); +``` + +```js +randomHexColorCode() // "#e34155" +randomHexColorCode() // "#fd73a6" +randomHexColorCode() // "#4144c6" +``` diff --git a/snippets/randomIntegerInRange.md b/snippets/randomIntegerInRange.md index e8fd26077..95e9383aa 100644 --- a/snippets/randomIntegerInRange.md +++ b/snippets/randomIntegerInRange.md @@ -9,5 +9,5 @@ const randomIntegerInRange = (min, max) => Math.floor(Math.random() * (max - min ``` ```js -randomIntegerInRange(0, 5) -> 2 +randomIntegerInRange(0, 5) // 2 ``` diff --git a/snippets/randomNumberInRange.md b/snippets/randomNumberInRange.md index 53d60b16d..b249c0e51 100644 --- a/snippets/randomNumberInRange.md +++ b/snippets/randomNumberInRange.md @@ -9,5 +9,5 @@ const randomNumberInRange = (min, max) => Math.random() * (max - min) + min; ``` ```js -randomNumberInRange(2,10) -> 6.0211363285087005 +randomNumberInRange(2,10) // 6.0211363285087005 ``` diff --git a/snippets/remove.md b/snippets/remove.md index cfbcba598..aec1dab10 100644 --- a/snippets/remove.md +++ b/snippets/remove.md @@ -14,5 +14,5 @@ const remove = (arr, func) => ``` ```js -remove([1, 2, 3, 4], n => n % 2 == 0) -> [2, 4] +remove([1, 2, 3, 4], n => n % 2 == 0) // [2, 4] ``` diff --git a/snippets/reverseString.md b/snippets/reverseString.md index 2fe9cdd0b..d34aac630 100644 --- a/snippets/reverseString.md +++ b/snippets/reverseString.md @@ -10,5 +10,5 @@ const reverseString = str => str.split('').reverse().join(''); ``` ```js -reverseString('foobar') -> 'raboof' +reverseString('foobar') // 'raboof' ``` diff --git a/snippets/runPromisesInSeries.md b/snippets/runPromisesInSeries.md index 9719ed6aa..d45b00d07 100644 --- a/snippets/runPromisesInSeries.md +++ b/snippets/runPromisesInSeries.md @@ -10,5 +10,5 @@ const runPromisesInSeries = ps => ps.reduce((p, next) => p.then(next), Promise.r ```js const delay = (d) => new Promise(r => setTimeout(r, d)) -runPromisesInSeries([() => delay(1000), () => delay(2000)]) -> //executes each promise sequentially, taking a total of 3 seconds to complete +runPromisesInSeries([() => delay(1000), () => delay(2000)]) // //executes each promise sequentially, taking a total of 3 seconds to complete ``` diff --git a/snippets/sample.md b/snippets/sample.md index 078542224..8a5dc3292 100644 --- a/snippets/sample.md +++ b/snippets/sample.md @@ -10,5 +10,5 @@ const sample = arr => arr[Math.floor(Math.random() * arr.length)]; ``` ```js -sample([3, 7, 9, 11]) -> 9 +sample([3, 7, 9, 11]) // 9 ``` diff --git a/snippets/select.md b/snippets/select.md index c3db1e047..1c6ff462f 100644 --- a/snippets/select.md +++ b/snippets/select.md @@ -11,5 +11,5 @@ const select = (from, selector) => ```js const obj = {selector: {to: {val: 'val to select'}}}; -select(obj, 'selector.to.val'); -> 'val to select' +select(obj, 'selector.to.val'); // 'val to select' ``` diff --git a/snippets/shallowClone.md b/snippets/shallowClone.md index cdef28d9b..2eed68a58 100644 --- a/snippets/shallowClone.md +++ b/snippets/shallowClone.md @@ -11,5 +11,5 @@ const shallowClone = obj => Object.assign({}, obj); ```js const a = { x: true, y: 1 }; const b = shallowClone(a); -a === b -> false +a === b // false ``` diff --git a/snippets/similarity.md b/snippets/similarity.md index e1f735be2..6a3c89b38 100644 --- a/snippets/similarity.md +++ b/snippets/similarity.md @@ -9,5 +9,5 @@ const similarity = (arr, values) => arr.filter(v => values.includes(v)); ``` ```js -similarity([1,2,3], [1,2,4]) -> [1,2] +similarity([1,2,3], [1,2,4]) // [1,2] ``` diff --git a/snippets/sortCharactersInString.md b/snippets/sortCharactersInString.md index 4e7e68cf7..8bdc6bcce 100644 --- a/snippets/sortCharactersInString.md +++ b/snippets/sortCharactersInString.md @@ -10,5 +10,5 @@ const sortCharactersInString = str => ``` ```js -sortCharactersInString('cabbage') -> 'aabbceg' +sortCharactersInString('cabbage') // 'aabbceg' ``` diff --git a/snippets/speechSynthesis.md b/snippets/speechSynthesis.md index 2ccb55375..74a628795 100644 --- a/snippets/speechSynthesis.md +++ b/snippets/speechSynthesis.md @@ -16,5 +16,5 @@ const speechSynthesis = message => { ``` ```js -speechSynthesis('Hello, World') -> // plays the message +speechSynthesis('Hello, World') // // plays the message ``` diff --git a/snippets/spreadOver.md b/snippets/spreadOver.md index d41b1cb36..3c26506c1 100644 --- a/snippets/spreadOver.md +++ b/snippets/spreadOver.md @@ -10,6 +10,6 @@ const spreadOver = fn => argsArr => fn(...argsArr); ```js const arrayMax = spreadOver(Math.max) -arrayMax([1,2,3]) -> 3 -arrayMax([1,2,4]) -> 4 +arrayMax([1,2,3]) // 3 +arrayMax([1,2,4]) // 4 ``` diff --git a/snippets/standardDeviation.md b/snippets/standardDeviation.md index 43d7139fd..0bddc99e8 100644 --- a/snippets/standardDeviation.md +++ b/snippets/standardDeviation.md @@ -17,6 +17,6 @@ const standardDeviation = (arr, usePopulation = false) => { ``` ```js -standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample) -standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population) +standardDeviation([10,2,38,23,38,23,21]) // 13.284434142114991 (sample) +standardDeviation([10,2,38,23,38,23,21], true) // 12.29899614287479 (population) ``` diff --git a/snippets/symmetricDifference.md b/snippets/symmetricDifference.md index 6879edb39..a26a4db4a 100644 --- a/snippets/symmetricDifference.md +++ b/snippets/symmetricDifference.md @@ -12,5 +12,5 @@ const symmetricDifference = (a, b) => { ``` ```js -symmetricDifference([1,2,3], [1,2,4]) -> [3,4] +symmetricDifference([1,2,3], [1,2,4]) // [3,4] ``` diff --git a/snippets/tail.md b/snippets/tail.md index 69983d169..cc7fb6130 100644 --- a/snippets/tail.md +++ b/snippets/tail.md @@ -9,6 +9,6 @@ const tail = arr => arr.length > 1 ? arr.slice(1) : arr; ``` ```js -tail([1,2,3]) -> [2,3] -tail([1]) -> [1] +tail([1,2,3]) // [2,3] +tail([1]) // [1] ``` diff --git a/snippets/take.md b/snippets/take.md index 07d25262d..d8257f54f 100644 --- a/snippets/take.md +++ b/snippets/take.md @@ -9,6 +9,6 @@ const take = (arr, n = 1) => arr.slice(0, n); ``` ```js -take([1, 2, 3], 5) -> [1, 2, 3] -take([1, 2, 3], 0) -> [] +take([1, 2, 3], 5) // [1, 2, 3] +take([1, 2, 3], 0) // [] ``` diff --git a/snippets/takeRight.md b/snippets/takeRight.md index 45d272ed0..13b8d47ed 100644 --- a/snippets/takeRight.md +++ b/snippets/takeRight.md @@ -9,6 +9,6 @@ const takeRight = (arr, n = 1) => arr.slice(arr.length - n, arr.length); ``` ```js -takeRight([1, 2, 3], 2) -> [ 2, 3 ] -takeRight([1, 2, 3]) -> [3] +takeRight([1, 2, 3], 2) // [ 2, 3 ] +takeRight([1, 2, 3]) // [3] ``` diff --git a/snippets/timeTaken.md b/snippets/timeTaken.md index b75402b9b..3ffa14dfe 100644 --- a/snippets/timeTaken.md +++ b/snippets/timeTaken.md @@ -12,6 +12,6 @@ const timeTaken = callback => { ``` ```js -timeTaken(() => Math.pow(2, 10)) -> 1024 +timeTaken(() => Math.pow(2, 10)) // 1024 (logged): timeTaken: 0.02099609375ms ``` diff --git a/snippets/toCamelCase.md b/snippets/toCamelCase.md index 366a988dd..3a106311f 100644 --- a/snippets/toCamelCase.md +++ b/snippets/toCamelCase.md @@ -15,8 +15,8 @@ const toCamelCase = str => { ``` ```js -toCamelCase("some_database_field_name") -> 'someDatabaseFieldName' -toCamelCase("Some label that needs to be camelized") -> 'someLabelThatNeedsToBeCamelized' -toCamelCase("some-javascript-property") -> 'someJavascriptProperty' -toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") -> 'someMixedStringWithSpacesUnderscoresAndHyphens' +toCamelCase("some_database_field_name") // 'someDatabaseFieldName' +toCamelCase("Some label that needs to be camelized") // 'someLabelThatNeedsToBeCamelized' +toCamelCase("some-javascript-property") // 'someJavascriptProperty' +toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") // 'someMixedStringWithSpacesUnderscoresAndHyphens' ``` diff --git a/snippets/toKebabCase.md b/snippets/toKebabCase.md index 50b7ead16..b1782726f 100644 --- a/snippets/toKebabCase.md +++ b/snippets/toKebabCase.md @@ -13,9 +13,9 @@ const toKebabCase = str => ``` ```js -toKebabCase("camelCase") -> 'camel-case' -toKebabCase("some text") -> 'some-text' -toKebabCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some-mixed-string-with-spaces-underscores-and-hyphens' -toKebabCase("AllThe-small Things") -> "all-the-small-things" -toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-xml-and-html" +toKebabCase("camelCase") // 'camel-case' +toKebabCase("some text") // 'some-text' +toKebabCase("some-mixed_string With spaces_underscores-and-hyphens") // 'some-mixed-string-with-spaces-underscores-and-hyphens' +toKebabCase("AllThe-small Things") // "all-the-small-things" +toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') // "i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-xml-and-html" ``` diff --git a/snippets/toOrdinalSuffix.md b/snippets/toOrdinalSuffix.md index 53541c162..bf0f19227 100644 --- a/snippets/toOrdinalSuffix.md +++ b/snippets/toOrdinalSuffix.md @@ -16,5 +16,5 @@ const toOrdinalSuffix = num => { ``` ```js -toOrdinalSuffix("123") -> "123rd" +toOrdinalSuffix("123") // "123rd" ``` diff --git a/snippets/toSnakeCase.md b/snippets/toSnakeCase.md index 72ed59aa4..4b3de32dd 100644 --- a/snippets/toSnakeCase.md +++ b/snippets/toSnakeCase.md @@ -14,10 +14,10 @@ const toSnakeCase = str => { ``` ```js -toSnakeCase("camelCase") -> 'camel_case' -toSnakeCase("some text") -> 'some_text' -toSnakeCase("some-javascript-property") -> 'some_javascript_property' -toSnakeCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some_mixed_string_with_spaces_underscores_and_hyphens' -toSnakeCase("AllThe-small Things") -> "all_the_smal_things" -toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html" +toSnakeCase("camelCase") // 'camel_case' +toSnakeCase("some text") // 'some_text' +toSnakeCase("some-javascript-property") // 'some_javascript_property' +toSnakeCase("some-mixed_string With spaces_underscores-and-hyphens") // 'some_mixed_string_with_spaces_underscores_and_hyphens' +toSnakeCase("AllThe-small Things") // "all_the_smal_things" +toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') // "i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html" ``` diff --git a/snippets/truncateString.md b/snippets/truncateString.md index 56561cc7f..66fc5d855 100644 --- a/snippets/truncateString.md +++ b/snippets/truncateString.md @@ -11,5 +11,5 @@ const truncateString = (str, num) => ``` ```js -truncateString('boomerang', 7) -> 'boom...' +truncateString('boomerang', 7) // 'boom...' ``` diff --git a/snippets/truthCheckCollection.md b/snippets/truthCheckCollection.md index a2c4cb35e..4a8aa7e14 100644 --- a/snippets/truthCheckCollection.md +++ b/snippets/truthCheckCollection.md @@ -9,5 +9,5 @@ const truthCheckCollection = (collection, pre) => (collection.every(obj => obj[p ``` ```js -truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") -> true +truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") // true ``` diff --git a/snippets/union.md b/snippets/union.md index d141d2a3e..155fbd7c4 100644 --- a/snippets/union.md +++ b/snippets/union.md @@ -9,5 +9,5 @@ const union = (a, b) => Array.from(new Set([...a, ...b])); ``` ```js -union([1,2,3], [4,3,2]) -> [1,2,3,4] +union([1,2,3], [4,3,2]) // [1,2,3,4] ``` diff --git a/snippets/validateNumber.md b/snippets/validateNumber.md index 075e6b4f9..70840cf88 100644 --- a/snippets/validateNumber.md +++ b/snippets/validateNumber.md @@ -11,5 +11,5 @@ const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == ``` ```js -validateNumber('10') -> true +validateNumber('10') // true ``` diff --git a/snippets/without.md b/snippets/without.md index 044f2e8f6..594ea2edd 100644 --- a/snippets/without.md +++ b/snippets/without.md @@ -11,5 +11,5 @@ const without = (arr, ...args) => arr.filter(v => !args.includes(v)); ``` ```js -without([2, 1, 2, 3], 1, 2) -> [3] +without([2, 1, 2, 3], 1, 2) // [3] ``` diff --git a/snippets/words.md b/snippets/words.md index 47d70659d..3d8097da7 100644 --- a/snippets/words.md +++ b/snippets/words.md @@ -10,6 +10,6 @@ const words = (str, pattern = /[^a-zA-Z-]+/) => str.split(pattern).filter(Boolea ``` ```js -words("I love javaScript!!") -> ["I", "love", "javaScript"] -words("python, javaScript & coffee") -> ["python", "javaScript", "coffee"] +words("I love javaScript!!") // ["I", "love", "javaScript"] +words("python, javaScript & coffee") // ["python", "javaScript", "coffee"] ``` From 9f0527e8c4c56bf23b3cb09b21c95c37e3b8bdbd Mon Sep 17 00:00:00 2001 From: Angelos Chalaris Date: Wed, 27 Dec 2017 16:43:00 +0200 Subject: [PATCH 27/36] Build and web build just in case --- README.md | 5200 ++++++++++++++++++++++++----------------------- docs/index.html | 722 ++++--- docs/mini.css | 2 +- 3 files changed, 3031 insertions(+), 2893 deletions(-) diff --git a/README.md b/README.md index 3269733e7..ba3ca3bfc 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,19 @@ -![Logo](/logo.png) +![Logo](/logo.png) + +# 30 seconds of code +[![License](https://img.shields.io/badge/license-CC0--1.0-blue.svg)](https://github.com/Chalarangelo/30-seconds-of-code/blob/master/LICENSE) [![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/30-seconds-of-code/Lobby) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![Travis Build](https://travis-ci.org/Chalarangelo/30-seconds-of-code.svg?branch=master)](https://travis-ci.org/Chalarangelo/30-seconds-of-code) [![Insight.io](https://img.shields.io/badge/insight.io-Ready-brightgreen.svg)](https://insight.io/github.com/Chalarangelo/30-seconds-of-code/tree/master/?source=0) [![js-semistandard-style](https://img.shields.io/badge/code%20style-semistandard-brightgreen.svg?style=flat-square)](https://github.com/Flet/semistandard) + +> 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 the [contribution guide](CONTRIBUTING.md). +- Snippets are written in ES6, use the [Babel transpiler](https://babeljs.io/) to ensure backwards-compatibility. +- You can import these snippets into Alfred 3, using [this file](https://github.com/lslvxy/30-seconds-of-code-alfredsnippets). + +## Table of Contents -# 30 seconds of code -[![License](https://img.shields.io/badge/license-CC0--1.0-blue.svg)](https://github.com/Chalarangelo/30-seconds-of-code/blob/master/LICENSE) [![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/30-seconds-of-code/Lobby) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![Travis Build](https://travis-ci.org/Chalarangelo/30-seconds-of-code.svg?branch=master)](https://travis-ci.org/Chalarangelo/30-seconds-of-code) [![Insight.io](https://img.shields.io/badge/insight.io-Ready-brightgreen.svg)](https://insight.io/github.com/Chalarangelo/30-seconds-of-code/tree/master/?source=0) [![js-semistandard-style](https://img.shields.io/badge/code%20style-semistandard-brightgreen.svg?style=flat-square)](https://github.com/Flet/semistandard) - -> 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 the [contribution guide](CONTRIBUTING.md). -- Snippets are written in ES6, use the [Babel transpiler](https://babeljs.io/) to ensure backwards-compatibility. -- You can import these snippets into Alfred 3, using [this file](https://github.com/lslvxy/30-seconds-of-code-alfredsnippets). - -## Table of Contents - -### Adapter +### Adapter * [`call`](#call) * [`collectInto`](#collectinto) * [`flip`](#flip) @@ -21,7 +21,7 @@ * [`promisify`](#promisify) * [`spreadOver`](#spreadover) -### Array +### Array * [`arrayGcd`](#arraygcd) * [`arrayLcm`](#arraylcm) * [`arrayMax`](#arraymax) @@ -66,7 +66,7 @@ * [`zip`](#zip) * [`zipObject`](#zipobject) -### Browser +### Browser * [`arrayToHtmlList`](#arraytohtmllist) * [`bottomVisible`](#bottomvisible) * [`currentURL`](#currenturl) @@ -78,13 +78,13 @@ * [`redirect`](#redirect) * [`scrollToTop`](#scrolltotop) -### Date +### Date * [`getDaysDiffBetweenDates`](#getdaysdiffbetweendates) * [`JSONToDate`](#jsontodate) * [`toEnglishDate`](#toenglishdate) * [`tomorrow`](#tomorrow) -### Function +### Function * [`chainAsync`](#chainasync) * [`compose`](#compose) * [`curry`](#curry) @@ -92,10 +92,10 @@ * [`runPromisesInSeries`](#runpromisesinseries) * [`sleep`](#sleep) -### Logic +### Logic * [`negate`](#negate) -### Math +### Math * [`arrayAverage`](#arrayaverage) * [`arraySum`](#arraysum) * [`clampNumber`](#clampnumber) @@ -125,14 +125,14 @@ * [`sdbmHashAlgorithm`](#sdbmhashalgorithm) * [`standardDeviation`](#standarddeviation) -### Media +### Media * [`speechSynthesis`](#speechsynthesis) -### Node +### Node * [`JSONToFile`](#jsontofile) * [`readFileLines`](#readfilelines) -### Object +### Object * [`cleanObj`](#cleanobj) * [`objectFromPairs`](#objectfrompairs) * [`objectToPairs`](#objecttopairs) @@ -141,7 +141,7 @@ * [`shallowClone`](#shallowclone) * [`truthCheckCollection`](#truthcheckcollection) -### String +### String * [`anagrams`](#anagrams) * [`capitalize`](#capitalize) * [`capitalizeEveryWord`](#capitalizeeveryword) @@ -157,7 +157,7 @@ * [`truncateString`](#truncatestring) * [`words`](#words) -### Utility +### Utility * [`coalesce`](#coalesce) * [`coalesceFactory`](#coalescefactory) * [`extendHex`](#extendhex) @@ -177,7 +177,7 @@ * [`UUIDGenerator`](#uuidgenerator) * [`validateNumber`](#validatenumber) -## Adapter +## Adapter ### call @@ -224,7 +224,7 @@ Flip takes a function as an argument, then makes the first argument the last Return a closure that takes variadic inputs, and splices the last argument to make it the first argument before applying the rest. ```js -const flip = fn => (...args) => fn(args.pop(), ...args) +const flip = fn => (...args) => fn(args.pop(), ...args); ``` ```js @@ -239,28 +239,48 @@ Object.assign(b, a) // == b [⬆ back to top](#table-of-contents) -### promisify +### pipeFunctions + +Performs left-to-right function composition. + +Use `Array.reduce()` with the spread operator (`...`) to perform left-to-right function composition. +The first (leftmost) function can accept one or more arguments; the remaining functions must be unary. + +```js +const pipeFunctions = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args))); +``` + +```js +const add5 = x => x + 5 +const multiply = (x, y) => x * y +const multiplyAndAdd5 = pipeFunctions(multiply, add5) +multiplyAndAdd5(5, 2) // 15 +``` -Converts an asynchronous function to return a promise. +[⬆ back to top](#table-of-contents) -Use currying to return a function returning a `Promise` that calls the original function. -Use the `...rest` operator to pass in all the parameters. - -*In Node 8+, you can use [`util.promisify`](https://nodejs.org/api/util.html#util_util_promisify_original)* - -```js -const promisify = func => - (...args) => - new Promise((resolve, reject) => - func(...args, (err, result) => - err ? reject(err) : resolve(result)) - ); -``` - -```js -const delay = promisify((d, cb) => setTimeout(cb, d)) -delay(2000).then(() => console.log('Hi!')) -> // Promise resolves after 2s -``` +### promisify + +Converts an asynchronous function to return a promise. + +Use currying to return a function returning a `Promise` that calls the original function. +Use the `...rest` operator to pass in all the parameters. + +*In Node 8+, you can use [`util.promisify`](https://nodejs.org/api/util.html#util_util_promisify_original)* + +```js +const promisify = func => + (...args) => + new Promise((resolve, reject) => + func(...args, (err, result) => + err ? reject(err) : resolve(result)) + ); +``` + +```js +const delay = promisify((d, cb) => setTimeout(cb, d)) +delay(2000).then(() => console.log('Hi!')) // // Promise resolves after 2s +``` [⬆ back to top](#table-of-contents) @@ -276,2548 +296,2550 @@ const spreadOver = fn => argsArr => fn(...argsArr); ```js const arrayMax = spreadOver(Math.max) -arrayMax([1,2,3]) -> 3 -arrayMax([1,2,4]) -> 4 +arrayMax([1,2,3]) // 3 +arrayMax([1,2,4]) // 4 ``` [⬆ back to top](#table-of-contents) -## Array +## Array + +### arrayGcd + +Calculates the greatest common denominator (gcd) of an array of numbers. + +Use `Array.reduce()` and the `gcd` formula (uses recursion) to calculate the greatest common denominator of an array of numbers. + +```js +const arrayGcd = arr => { + const gcd = (x, y) => !y ? x : gcd(y, x % y); + return arr.reduce((a,b) => gcd(a,b)); +} +``` + +```js +arrayGcd([1,2,3,4,5]) // 1 +arrayGcd([4,8,12]) // 4 +``` + +[⬆ back to top](#table-of-contents) + +### arrayLcm + +Calculates the lowest common multiple (lcm) of an array of numbers. + +Use `Array.reduce()` and the `lcm` formula (uses recursion) to calculate the lowest common multiple of an array of numbers. + +```js +const arrayLcm = arr => { + const gcd = (x, y) => !y ? x : gcd(y, x % y); + const lcm = (x, y) => (x*y)/gcd(x, y); + return arr.reduce((a,b) => lcm(a,b)); +} +``` + +```js +arrayLcm([1,2,3,4,5]) // 60 +arrayLcm([4,8,12]) // 24 +``` + +[⬆ back to top](#table-of-contents) + +### arrayMax + +Returns the maximum value in an array. + +Use `Math.max()` combined with the spread operator (`...`) to get the maximum value in the array. + +```js +const arrayMax = arr => Math.max(...arr); +``` + +```js +arrayMax([10, 1, 5]) // 10 +``` + +[⬆ back to top](#table-of-contents) + +### arrayMin + +Returns the minimum value in an array. + +Use `Math.min()` combined with the spread operator (`...`) to get the minimum value in the array. + +```js +const arrayMin = arr => Math.min(...arr); +``` + +```js +arrayMin([10, 1, 5]) // 1 +``` + +[⬆ back to top](#table-of-contents) + +### chunk + +Chunks an array into smaller arrays of a specified size. + +Use `Array.from()` to create a new array, that fits the number of chunks that will be produced. +Use `Array.slice()` to map each element of the new array to a chunk the length of `size`. +If the original array can't be split evenly, the final chunk will contain the remaining elements. + +```js +const chunk = (arr, size) => + Array.from({length: Math.ceil(arr.length / size)}, (v, i) => arr.slice(i * size, i * size + size)); +``` + +```js +chunk([1,2,3,4,5], 2) // [[1,2],[3,4],[5]] +``` + +[⬆ back to top](#table-of-contents) + +### compact + +Removes falsey values from an array. + +Use `Array.filter()` to filter out falsey values (`false`, `null`, `0`, `""`, `undefined`, and `NaN`). + +```js +const compact = arr => arr.filter(Boolean); +``` + +```js +compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) // [ 1, 2, 3, 'a', 's', 34 ] +``` + +[⬆ back to top](#table-of-contents) + +### countOccurrences + +Counts the occurrences of a value in an array. + +Use `Array.reduce()` to increment a counter each time you encounter the specific value inside the array. + +```js +const countOccurrences = (arr, value) => arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0); +``` + +```js +countOccurrences([1,1,2,1,2,3], 1) // 3 +``` + +[⬆ back to top](#table-of-contents) + +### deepFlatten + +Deep flattens an array. + +Use recursion. +Use `Array.concat()` with an empty array (`[]`) and the spread operator (`...`) to flatten an array. +Recursively flatten each element that is an array. + +```js +const deepFlatten = arr => [].concat(...arr.map(v => Array.isArray(v) ? deepFlatten(v) : v)); +``` + +```js +deepFlatten([1,[2],[[3],4],5]) // [1,2,3,4,5] +``` + +[⬆ back to top](#table-of-contents) + +### difference + +Returns the difference between two arrays. + +Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values not contained in `b`. + +```js +const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); }; +``` + +```js +difference([1,2,3], [1,2,4]) // [3] +``` + +[⬆ back to top](#table-of-contents) + +### differenceWith + +Filters out all values from an array for which the comparator function does not return `true`. + +Use `Array.filter()` and `Array.find()` to find the appropriate values. + +```js +const differenceWith = (arr, val, comp) => arr.filter(a => !val.find(b => comp(a, b))) +``` + +```js +differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) // [1, 1.2] +``` + +[⬆ back to top](#table-of-contents) + +### distinctValuesOfArray + +Returns all the distinct values of an array. + +Use ES6 `Set` and the `...rest` operator to discard all duplicated values. + +```js +const distinctValuesOfArray = arr => [...new Set(arr)]; +``` + +```js +distinctValuesOfArray([1,2,2,3,4,4,5]) // [1,2,3,4,5] +``` + +[⬆ back to top](#table-of-contents) + +### dropElements + +Removes elements in an array until the passed function returns `true`. Returns the remaining elements in the array. + +Loop through the array, using `Array.slice()` to drop the first element of the array until the returned value from the function is `true`. +Returns the remaining elements. + +```js +const dropElements = (arr, func) => { + while (arr.length > 0 && !func(arr[0])) arr = arr.slice(1); + return arr; +}; +``` + +```js +dropElements([1, 2, 3, 4], n => n >= 3) // [3,4] +``` + +[⬆ back to top](#table-of-contents) + +### dropRight + +Returns a new array with `n` elements removed from the right. + +Use `Array.slice()` to slice the remove the specified number of elements from the right. + +```js +const dropRight = (arr, n = 1) => arr.slice(0, -n); +``` + +```js +dropRight([1,2,3]) // [1,2] +dropRight([1,2,3], 2) // [1] +dropRight([1,2,3], 42) // [] +``` + +[⬆ back to top](#table-of-contents) + +### everyNth + +Returns every nth element in an array. + +Use `Array.filter()` to create a new array that contains every nth element of a given array. + +```js +const everyNth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1); +``` + +```js +everyNth([1,2,3,4,5,6], 2) // [ 2, 4, 6 ] +``` + +[⬆ back to top](#table-of-contents) + +### filterNonUnique + +Filters out the non-unique values in an array. + +Use `Array.filter()` for an array containing only the unique values. + +```js +const filterNonUnique = arr => arr.filter(i => arr.indexOf(i) === arr.lastIndexOf(i)); +``` + +```js +filterNonUnique([1,2,2,3,4,4,5]) // [1,3,5] +``` + +[⬆ back to top](#table-of-contents) + +### flatten + +Flattens an array. + +Use a new array and concatenate it with the spread input array causing a shallow denesting of any contained arrays. + +```js +const flatten = arr => [ ].concat( ...arr ); +``` + +```js +flatten([1,[2],3,4]) // [1,2,3,4] +``` + +[⬆ back to top](#table-of-contents) + +### flattenDepth + +Flattens an array up to the specified depth. + +Use recursion, decrementing `depth` by 1 for each level of depth. +Use `Array.reduce()` and `Array.concat()` to merge elements or arrays. +Base case, for `depth` equal to `1` stops recursion. +Omit the second element, `depth` to flatten only to a depth of `1` (single flatten). + +```js +const flattenDepth = (arr, depth = 1) => + depth != 1 ? arr.reduce((a, v) => a.concat(Array.isArray(v) ? flattenDepth(v, depth - 1) : v), []) + : arr.reduce((a, v) => a.concat(v), []); +``` + +```js +flatten([1,[2],3,4]) // [1,2,3,4] +``` + +[⬆ back to top](#table-of-contents) + +### groupBy + +Groups the elements of an array based on the given function. + +Use `Array.map()` to map the values of an array to a function or property name. +Use `Array.reduce()` to create an object, where the keys are produced from the mapped results. + +```js +const groupBy = (arr, func) => + arr.map(typeof func === 'function' ? func : val => val[func]) + .reduce((acc, val, i) => { acc[val] = (acc[val] || []).concat(arr[i]); return acc; }, {}); +``` + +```js +groupBy([6.1, 4.2, 6.3], Math.floor) // {4: [4.2], 6: [6.1, 6.3]} +groupBy(['one', 'two', 'three'], 'length') // {3: ['one', 'two'], 5: ['three']} +``` + +[⬆ back to top](#table-of-contents) + +### head + +Returns the head of a list. + +Use `arr[0]` to return the first element of the passed array. + +```js +const head = arr => arr[0]; +``` + +```js +head([1,2,3]) // 1 +``` + +[⬆ back to top](#table-of-contents) + +### initial + +Returns all the elements of an array except the last one. + +Use `arr.slice(0,-1)` to return all but the last element of the array. + +```js +const initial = arr => arr.slice(0, -1); +``` + +```js +initial([1,2,3]) // [1,2] +``` + +[⬆ back to top](#table-of-contents) + +### initialize2DArray + +Initializes a 2D array of given width and height and value. + +Use `Array.map()` to generate h rows where each is a new array of size w initialize with value. If the value is not provided, default to `null`. + +```js +const initialize2DArray = (w, h, val = null) => Array(h).fill().map(() => Array(w).fill(val)); +``` + +```js +initialize2DArray(2, 2, 0) // [[0,0], [0,0]] +``` + +[⬆ back to top](#table-of-contents) + +### initializeArrayWithRange + +Initializes an array containing the numbers in the specified range where `start` and `end` are inclusive. + +Use `Array((end + 1) - start)` to create an array of the desired length, `Array.map()` to fill with the desired values in a range. +You can omit `start` to use a default value of `0`. + +```js +const initializeArrayWithRange = (end, start = 0) => + Array.from({ length: (end + 1) - start }).map((v, i) => i + start); +``` + +```js +initializeArrayWithRange(5) // [0,1,2,3,4,5] +initializeArrayWithRange(7, 3) // [3,4,5,6,7] +``` + +[⬆ back to top](#table-of-contents) + +### initializeArrayWithValues + +Initializes and fills an array with the specified values. + +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`. + +```js +const initializeArrayWithValues = (n, value = 0) => Array(n).fill(value); +``` + +```js +initializeArrayWithValues(5, 2) // [2,2,2,2,2] +``` + +[⬆ back to top](#table-of-contents) + +### intersection + +Returns a list of elements that exist in both arrays. + +Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values contained in `b`. + +```js +const intersection = (a, b) => { const s = new Set(b); return a.filter(x => s.has(x)); }; +``` + +```js +intersection([1,2,3], [4,3,2]) // [2,3] +``` + +[⬆ back to top](#table-of-contents) + +### last + +Returns the last element in an array. + +Use `arr.length - 1` to compute the index of the last element of the given array and returning it. + +```js +const last = arr => arr[arr.length - 1]; +``` + +```js +last([1,2,3]) // 3 +``` + +[⬆ back to top](#table-of-contents) + +### mapObject + +Maps the values of an array to an object using a function, where the key-value pairs consist of the original value as the key and the mapped value. + +Use an anonymous inner function scope to declare an undefined memory space, using closures to store a return value. Use a new `Array` to store the array with a map of the function over its data set and a comma operator to return a second step, without needing to move from one context to another (due to closures and order of operations). + +```js +const mapObject = (arr, fn) => + (a => (a = [arr, arr.map(fn)], a[0].reduce( (acc,val,ind) => (acc[val] = a[1][ind], acc), {}) )) ( ); +``` + +```js +const squareIt = arr => mapObject(arr, a => a*a) +squareIt([1,2,3]) // { 1: 1, 2: 4, 3: 9 } +``` + +[⬆ back to top](#table-of-contents) + +### nthElement + +Returns the nth element of an array. + +Use `Array.slice()` to get an array containing the nth element at the first place. +If the index is out of bounds, return `[]`. +Omit the second argument, `n`, to get the first element of the array. + +```js +const nthElement = (arr, n=0) => (n>0? arr.slice(n,n+1) : arr.slice(n))[0]; +``` + +```js +nthElement(['a','b','c'],1) // 'b' +nthElement(['a','b','b'],-3) // 'a' +``` + +[⬆ back to top](#table-of-contents) + +### pick + +Picks the key-value pairs corresponding to the given keys from an object. + +Use `Array.reduce()` to convert the filtered/picked keys back to an object with the corresponding key-value pair if the key exists in the obj. + +```js +const pick = (obj, arr) => + arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {}); +``` + +```js +pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) // { 'a': 1, 'c': 3 } +``` + +[⬆ back to top](#table-of-contents) + +### pull + +Mutates the original array to filter out the values specified. + +Use `Array.filter()` and `Array.includes()` to pull out the values that are not needed. +Use `Array.length = 0` to mutate the passed in an array by resetting it's length to zero and `Array.push()` to re-populate it with only the pulled values. + +_(For a snippet that does not mutate the original array see [`without`](#without))_ + +```js +const pull = (arr, ...args) => { + let argState = Array.isArray(args[0]) ? args[0] : args; + let pulled = arr.filter((v, i) => !argState.includes(v)); + arr.length = 0; + pulled.forEach(v => arr.push(v)); +}; +``` + +```js +let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c']; +pull(myArray1, 'a', 'c'); +console.log(myArray1) // [ 'b', 'b' ] + +let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c']; +pull(myArray2, ['a', 'c']); +console.log(myArray2) // [ 'b', 'b' ] +``` + +[⬆ back to top](#table-of-contents) + +### pullAtIndex + +Mutates the original array to filter out the values at the specified indexes. + +Use `Array.filter()` and `Array.includes()` to pull out the values that are not needed. +Use `Array.length = 0` to mutate the passed in an array by resetting it's length to zero and `Array.push()` to re-populate it with only the pulled values. +Use `Array.push()` to keep track of pulled values + +```js +const pullAtIndex = (arr, pullArr) => { + let removed = []; + let pulled = arr.map((v, i) => pullArr.includes(i) ? removed.push(v) : v) + .filter((v, i) => !pullArr.includes(i)) + arr.length = 0; + pulled.forEach(v => arr.push(v)); + return removed; +} +``` + +```js +let myArray = ['a', 'b', 'c', 'd']; +let pulled = pullAtIndex(myArray, [1, 3]); + +console.log(myArray); // [ 'a', 'c' ] +console.log(pulled); // [ 'b', 'd' ] +``` + +[⬆ back to top](#table-of-contents) + +### pullAtValue + +Mutates the original array to filter out the values specified. Returns the removed elements. + +Use `Array.filter()` and `Array.includes()` to pull out the values that are not needed. +Use `Array.length = 0` to mutate the passed in an array by resetting it's length to zero and `Array.push()` to re-populate it with only the pulled values. +Use `Array.push()` to keep track of pulled values + +```js +const pullAtValue = (arr, pullArr) => { + let removed = [], + pushToRemove = arr.forEach((v, i) => pullArr.includes(v) ? removed.push(v) : v), + mutateTo = arr.filter((v, i) => !pullArr.includes(v)); + arr.length = 0; + mutateTo.forEach(v => arr.push(v)); + return removed; +} +``` + +```js +let myArray = ['a', 'b', 'c', 'd']; +let pulled = pullAtValue(myArray, ['b', 'd']); +console.log(myArray); // [ 'a', 'c' ] +console.log(pulled); // [ 'b', 'd' ] +``` + +[⬆ back to top](#table-of-contents) + +### remove + +Removes elements from an array for which the given function returns `false`. + +Use `Array.filter()` to find array elements that return truthy values and `Array.reduce()` to remove elements using `Array.splice()`. +The `func` is invoked with three arguments (`value, index, array`). + +```js +const remove = (arr, func) => + Array.isArray(arr) ? arr.filter(func).reduce((acc, val) => { + arr.splice(arr.indexOf(val), 1); return acc.concat(val); + }, []) + : []; +``` + +```js +remove([1, 2, 3, 4], n => n % 2 == 0) // [2, 4] +``` + +[⬆ back to top](#table-of-contents) + +### sample + +Returns a random element from an array. + +Use `Math.random()` to generate a random number, multiply it by `length` and round it of to the nearest whole number using `Math.floor()`. +This method also works with strings. + +```js +const sample = arr => arr[Math.floor(Math.random() * arr.length)]; +``` + +```js +sample([3, 7, 9, 11]) // 9 +``` + +[⬆ back to top](#table-of-contents) + +### shuffle + +Randomizes the order of the values of an array, returning a new array. + +Uses the Fisher-Yates algoritm to reorder the elements of the array, based on the [Lodash implementation](https://github.com/lodash/lodash/blob/b2ea6b1cd251796dcb5f9700c4911a7b6223920b/shuffle.js), but as a pure function. + +```js +const shuffle = ([...arr]) => { + let m = arr.length; + while (m) { + const i = Math.floor(Math.random() * m--); + [arr[m], arr[i]] = [arr[i], arr[m]]; + } + return arr; +}; +``` + +```js +const foo = [1,2,3] +shuffle(foo) // [2,3,1] +console.log(foo) // [1,2,3] +``` + +[⬆ back to top](#table-of-contents) + +### similarity + +Returns an array of elements that appear in both arrays. + +Use `filter()` to remove values that are not part of `values`, determined using `includes()`. + +```js +const similarity = (arr, values) => arr.filter(v => values.includes(v)); +``` + +```js +similarity([1,2,3], [1,2,4]) // [1,2] +``` + +[⬆ back to top](#table-of-contents) + +### symmetricDifference + +Returns the symmetric difference between two arrays. + +Create a `Set` from each array, then use `Array.filter()` on each of them to only keep values not contained in the other. + +```js +const symmetricDifference = (a, b) => { + const sA = new Set(a), sB = new Set(b); + return [...a.filter(x => !sB.has(x)), ...b.filter(x => !sA.has(x))]; +} +``` + +```js +symmetricDifference([1,2,3], [1,2,4]) // [3,4] +``` + +[⬆ back to top](#table-of-contents) + +### tail + +Returns all elements in an array except for the first one. + +Return `arr.slice(1)` if the array's `length` is more than `1`, otherwise, return the whole array. + +```js +const tail = arr => arr.length > 1 ? arr.slice(1) : arr; +``` + +```js +tail([1,2,3]) // [2,3] +tail([1]) // [1] +``` + +[⬆ back to top](#table-of-contents) + +### take + +Returns an array with n elements removed from the beginning. + +Use `Array.slice()` to create a slice of the array with `n` elements taken from the beginning. + +```js +const take = (arr, n = 1) => arr.slice(0, n); +``` + +```js +take([1, 2, 3], 5) // [1, 2, 3] +take([1, 2, 3], 0) // [] +``` + +[⬆ back to top](#table-of-contents) + +### takeRight + +Returns an array with n elements removed from the end. + +Use `Array.slice()` to create a slice of the array with `n` elements taken from the end. + +```js +const takeRight = (arr, n = 1) => arr.slice(arr.length - n, arr.length); +``` + +```js +takeRight([1, 2, 3], 2) // [ 2, 3 ] +takeRight([1, 2, 3]) // [3] +``` + +[⬆ back to top](#table-of-contents) + +### union + +Returns every element that exists in any of the two arrays once. + +Create a `Set` with all values of `a` and `b` and convert to an array. + +```js +const union = (a, b) => Array.from(new Set([...a, ...b])); +``` + +```js +union([1,2,3], [4,3,2]) // [1,2,3,4] +``` + +[⬆ back to top](#table-of-contents) + +### without + +Filters out the elements of an array, that have one of the specified values. + +Use `Array.filter()` to create an array excluding(using `!Array.includes()`) all given values. + +_(For a snippet that mutates the original array see [`pull`](#pull))_ + +```js +const without = (arr, ...args) => arr.filter(v => !args.includes(v)); +``` + +```js +without([2, 1, 2, 3], 1, 2) // [3] +``` + +[⬆ back to top](#table-of-contents) + +### zip + +Creates an array of elements, grouped based on the position in the original arrays. + +Use `Math.max.apply()` to get the longest array in the arguments. +Creates an array with that length as return value and use `Array.from()` with a map-function to create an array of grouped elements. +If lengths of the argument-arrays vary, `undefined` is used where no value could be found. + +```js +const zip = (...arrays) => { + const maxLength = Math.max(...arrays.map(x => x.length)); + return Array.from({length: maxLength}).map((_, i) => { + return Array.from({length: arrays.length}, (_, k) => arrays[k][i]); + }) +} +``` + +```js +zip(['a', 'b'], [1, 2], [true, false]); // [['a', 1, true], ['b', 2, false]] +zip(['a'], [1, 2], [true, false]); // [['a', 1, true], [undefined, 2, false]] +``` + +[⬆ back to top](#table-of-contents) + +### zipObject + +Given an array of valid property identifiers and an array of values, return an object associating the properties to the values. + +Since an object can have undefined values but not undefined property pointers, the array of properties is used to decide the structure of the resulting object using `Array.reduce()`. + +```js +const zipObject = ( props, values ) => props.reduce( ( obj, prop, index ) => ( obj[prop] = values[index], obj ), {} ) +``` + +```js +zipObject(['a','b','c'], [1,2]) // {a: 1, b: 2, c: undefined} +zipObject(['a','b'], [1,2,3]) // {a: 1, b: 2} +``` + +[⬆ back to top](#table-of-contents) +## Browser + +### arrayToHtmlList + +Converts the given array elements into `
  • ` tags and appends them to the list of the given id. + +Use `Array.map()` and `document.querySelector()` to create a list of html tags. + +```js +const arrayToHtmlList = (arr, listID) => arr.map(item => document.querySelector("#"+listID).innerHTML+=`
  • ${item}
  • `); +``` + +```js +arrayToHtmlList(['item 1', 'item 2'],'myListID') +``` + +[⬆ back to top](#table-of-contents) + +### bottomVisible + +Returns `true` if the bottom of the page is visible, `false` otherwise. + +Use `scrollY`, `scrollHeight` and `clientHeight` to determine if the bottom of the page is visible. + +```js +const bottomVisible = () => + document.documentElement.clientHeight + window.scrollY >= (document.documentElement.scrollHeight || document.documentElement.clientHeight); +``` + +```js +// bottomVisible() // true +``` + +[⬆ back to top](#table-of-contents) + +### currentURL + +Returns the current URL. + +Use `window.location.href` to get current URL. + +```js +const currentURL = () => window.location.href; +``` + +```js +currentUrl() // 'https://google.com' +``` + +[⬆ back to top](#table-of-contents) + +### detectDeviceType + +Detects wether the website is being opened in a mobile device or a desktop/laptop. + +Use a regular expression to test the `navigator.userAgent` property to figure out if the device is a mobile device or a desktop/laptop. + +```js +const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? "Mobile" : "Desktop"; +``` + +```js +detectDeviceType() // "Mobile" +detectDeviceType() // "Desktop" +``` + +[⬆ back to top](#table-of-contents) + +### elementIsVisibleInViewport + +Returns `true` if the element specified is visible in the viewport, `false` otherwise. + +Use `Element.getBoundingClientRect()` and the `window.inner(Width|Height)` values +to determine if a given element is visible in the viewport. +Omit the second argument to determine if the element is entirely visible, or specify `true` to determine if +it is partially visible. + +```js +const elementIsVisibleInViewport = (el, partiallyVisible = false) => { + const { top, left, bottom, right } = el.getBoundingClientRect(); + const { innerHeight, innerWidth } = window; + return partiallyVisible + ? ((top > 0 && top < innerHeight) || (bottom > 0 && bottom < innerHeight)) && + ((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth)) + : top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth; +}; +``` + +```js +// e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10} +elementIsVisibleInViewport(el) // false // (not fully visible) +elementIsVisibleInViewport(el, true) // true // (partially visible) +``` + +[⬆ back to top](#table-of-contents) + +### getScrollPosition + +Returns the scroll position of the current page. + +Use `pageXOffset` and `pageYOffset` if they are defined, otherwise `scrollLeft` and `scrollTop`. +You can omit `el` to use a default value of `window`. + +```js +const getScrollPosition = (el = window) => + ({x: (el.pageXOffset !== undefined) ? el.pageXOffset : el.scrollLeft, + y: (el.pageYOffset !== undefined) ? el.pageYOffset : el.scrollTop}); +``` + +```js +getScrollPosition() // {x: 0, y: 200} +``` + +[⬆ back to top](#table-of-contents) + +### getURLParameters + +Returns an object containing the parameters of the current URL. + +Use `match()` with an appropriate regular expression to get all key-value pairs, `Array.reduce()` to map and combine them into a single object. +Pass `location.search` as the argument to apply to the current `url`. + +```js +const getURLParameters = url => + url.match(/([^?=&]+)(=([^&]*))/g).reduce( + (a, v) => (a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1), a), {} + ); +``` + +```js +getURLParameters('http://url.com/page?name=Adam&surname=Smith') // {name: 'Adam', surname: 'Smith'} +``` + +[⬆ back to top](#table-of-contents) + +### httpsRedirect + +Redirects the page to HTTPS if its currently in HTTP. Also, pressing the back button doesn't take it back to the HTTP page as its replaced in the history. + +Use `location.protocol` to get the protocol currently being used. If it's not HTTPS, use `location.replace()` to replace the existing page with the HTTPS version of the page. Use `location.href` to get the full address, split it with `String.split()` and remove the protocol part of the URL. + +```js +const httpsRedirect = () => { + if (location.protocol !== 'https:') location.replace('https://' + location.href.split('//')[1]); +}; +``` + +[⬆ back to top](#table-of-contents) + +### redirect + +Redirects to a specified URL. + +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`). + +```js +const redirect = (url, asLink = true) => + asLink ? window.location.href = url : window.location.replace(url); +``` + +```js +redirect('https://google.com') +``` + +[⬆ back to top](#table-of-contents) + +### scrollToTop + +Smooth-scrolls to the top of the page. + +Get distance from top using `document.documentElement.scrollTop` or `document.body.scrollTop`. +Scroll by a fraction of the distance from the top. Use `window.requestAnimationFrame()` to animate the scrolling. + +```js +const scrollToTop = () => { + const c = document.documentElement.scrollTop || document.body.scrollTop; + if (c > 0) { + window.requestAnimationFrame(scrollToTop); + window.scrollTo(0, c - c / 8); + } +}; +``` + +```js +scrollToTop() +``` + +[⬆ back to top](#table-of-contents) +## Date + +### getDaysDiffBetweenDates + +Returns the difference (in days) between two dates. + +Calculate the difference (in days) between two `Date` objects. + +```js +const getDaysDiffBetweenDates = (dateInitial, dateFinal) => (dateFinal - dateInitial) / (1000 * 3600 * 24); +``` + +```js +getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) // 9 +``` + +[⬆ back to top](#table-of-contents) + +### JSONToDate + +Converts a JSON object to a date. + +Use `Date()`, to convert dates in JSON format to readable format (`dd/mm/yyyy`). + +```js +const JSONToDate = arr => { + const dt = new Date(parseInt(arr.toString().substr(6))); + return `${dt.getDate()}/${dt.getMonth() + 1}/${dt.getFullYear()}`; +}; +``` + +```js +JSONToDate(/Date(1489525200000)/) // "14/3/2017" +``` + +[⬆ back to top](#table-of-contents) + +### toEnglishDate + +Converts a date from American format to English format. + +Use `Date.toISOString()`, `split('T')` and `replace()` to convert a date from American format to the English format. +Throws an error if the passed time cannot be converted to a date. + +```js +const toEnglishDate = (time) => { try { return new Date(time).toISOString().split('T')[0].replace(/-/g, '/'); } catch (e) {} }; +``` + +```js +toEnglishDate('09/21/2010') // '21/09/2010' +``` + +[⬆ back to top](#table-of-contents) + +### tomorrow + +Results in a string representation of tomorrow's date. +Use `new Date()` to get today's date, adding `86400000` of seconds to it(24 hours), using `toISOString` to convert Date object to string. + +```js +const tomorrow = () => new Date(new Date().getTime() + 86400000).toISOString().split('T')[0]; +// tomorrow() -> 2017-12-27 (if current date is 2017-12-26) +``` + +[⬆ back to top](#table-of-contents) +## Function + +### chainAsync + +Chains asynchronous functions. + +Loop through an array of functions containing asynchronous events, calling `next` when each asynchronous event has completed. + +```js +const chainAsync = fns => { let curr = 0; const next = () => fns[curr++](next); next(); }; +``` + +```js +chainAsync([ + next => { console.log('0 seconds'); setTimeout(next, 1000); }, + next => { console.log('1 second'); setTimeout(next, 1000); }, + next => { console.log('2 seconds'); } +]) +``` + +[⬆ back to top](#table-of-contents) + +### compose + +Performs right-to-left function composition. + +Use `Array.reduce()` to perform right-to-left function composition. +The last (rightmost) function can accept one or more arguments; the remaining functions must be unary. + +```js +const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args))); +``` + +```js +const add5 = x => x + 5 +const multiply = (x, y) => x * y +const multiplyAndAdd5 = compose(add5, multiply) +multiplyAndAdd5(5, 2) // 15 +``` + +[⬆ back to top](#table-of-contents) + +### curry + +Curries a function. + +Use recursion. +If the number of provided arguments (`args`) is sufficient, call the passed function `fn`. +Otherwise, return a curried function `fn` that expects the rest of the arguments. +If you want to curry a function that accepts a variable number of arguments (a variadic function, e.g. `Math.min()`), you can optionally pass the number of arguments to the second parameter `arity`. + +```js +const curry = (fn, arity = fn.length, ...args) => + arity <= args.length + ? fn(...args) + : curry.bind(null, fn, arity, ...args); +``` + +```js +curry(Math.pow)(2)(10) // 1024 +curry(Math.min, 3)(10)(50)(2) // 2 +``` + +[⬆ back to top](#table-of-contents) + +### functionName + +Logs the name of a function. + +Use `console.debug()` and the `name` property of the passed method to log the method's name to the `debug` channel of the console. + +```js +const functionName = fn => (console.debug(fn.name), fn); +``` + +```js +functionName(Math.max) // max (logged in debug channel of console) +``` + +[⬆ back to top](#table-of-contents) + +### runPromisesInSeries + +Runs an array of promises in series. + +Use `Array.reduce()` to create a promise chain, where each promise returns the next promise when resolved. + +```js +const runPromisesInSeries = ps => ps.reduce((p, next) => p.then(next), Promise.resolve()); +``` + +```js +const delay = (d) => new Promise(r => setTimeout(r, d)) +runPromisesInSeries([() => delay(1000), () => delay(2000)]) // //executes each promise sequentially, taking a total of 3 seconds to complete +``` + +[⬆ back to top](#table-of-contents) + +### sleep + +Delays the execution of an asynchronous function. + +Delay executing part of an `async` function, by putting it to sleep, returning a `Promise`. + +```js +const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); +``` + +```js +async function sleepyWork() { + console.log('I\'m going to sleep for 1 second.'); + await sleep(1000); + console.log('I woke up after 1 second.'); +} +``` + +[⬆ back to top](#table-of-contents) +## Logic + +### negate + +Negates a predicate function. + +Take a predicate function and apply `not` to it with its arguments. + +```js +const negate = func => (...args) => !func(...args); +``` + +```js +filter([1, 2, 3, 4, 5, 6], negate(isEven)) // [1, 3, 5] +negate(isOdd)(1) // false +``` + +[⬆ back to top](#table-of-contents) +## Math + +### arrayAverage + +Returns the average of an array of numbers. + +Use `Array.reduce()` to add each value to an accumulator, initialized with a value of `0`, divide by the `length` of the array. + +```js +const arrayAverage = arr => arr.reduce((acc, val) => acc + val, 0) / arr.length; +``` + +```js +arrayAverage([1,2,3]) // 2 +``` + +[⬆ back to top](#table-of-contents) + +### arraySum + +Returns the sum of an array of numbers. + +Use `Array.reduce()` to add each value to an accumulator, initialized with a value of `0`. + +```js +const arraySum = arr => arr.reduce((acc, val) => acc + val, 0); +``` + +```js +arraySum([1,2,3,4]) // 10 +``` + +[⬆ back to top](#table-of-contents) + +### clampNumber + +Clamps `num` within the inclusive range specified by the boundary values `a` and `b`. + +If `num` falls within the range, return `num`. +Otherwise, return the nearest number in the range. + +```js +const clampNumber = (num, a, b) => Math.max(Math.min(num, Math.max(a,b)),Math.min(a,b)); +``` + +```js +clampNumber(2, 3, 5) // 3 +clampNumber(1, -1, -5) // -1 +clampNumber(3, 2, 4) // 3 +``` + +[⬆ back to top](#table-of-contents) + +### collatz + +Applies the Collatz algorithm. + +If `n` is even, return `n/2`. Otherwise, return `3n+1`. + +```js +const collatz = n => (n % 2 == 0) ? (n / 2) : (3 * n + 1); +``` + +```js +collatz(8) // 4 +collatz(5) // 16 +``` + +[⬆ back to top](#table-of-contents) + +### digitize + +Converts a number to an array of digits. + +Convert the number to a string, using spread operators in ES6(`[...string]`) build an array. +Use `Array.map()` and `parseInt()` to transform each value to an integer. + +```js +const digitize = n => [...''+n].map(i => parseInt(i)); +``` + +```js +differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) // [1, 1.2] +``` + +[⬆ back to top](#table-of-contents) + +### distance + +Returns the distance between two points. + +Use `Math.hypot()` to calculate the Euclidean distance between two points. + +```js +const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0); +``` + +```js +distance(1,1, 2,3) // 2.23606797749979 +``` + +[⬆ back to top](#table-of-contents) + +### factorial + +Calculates the factorial of a number. + +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`. +Throws an exception if `n` is a negative number. + +```js +const factorial = n => + n < 0 ? (() => { throw new TypeError('Negative numbers are not allowed!'); })() + : n <= 1 ? 1 : n * factorial(n - 1); +``` + +```js +factorial(6) // 720 +``` + +[⬆ back to top](#table-of-contents) + +### fibonacci + +Generates an array, containing the Fibonacci sequence, up until the nth term. + +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. + +```js +const fibonacci = n => + Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []); +``` + +```js +factorial(6) // 720 +``` + +[⬆ back to top](#table-of-contents) + +### fibonacciCountUntilNum + +Returns the number of fibonnacci numbers up to `num`(`0` and `num` inclusive). + +Use a mathematical formula to calculate the number of fibonacci numbers until `num`. + +```js +const fibonacciCountUntilNum = num => + Math.ceil(Math.log(num * Math.sqrt(5) + 1/2) / Math.log((Math.sqrt(5)+1)/2)); +``` + +```js +fibonacciCountUntilNum(10) // 7 +``` + +[⬆ back to top](#table-of-contents) + +### fibonacciUntilNum + +Generates an array, containing the Fibonacci sequence, up until the nth term. + +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. +Uses a mathematical formula to calculate the length of the array required. + +```js +const fibonacciUntilNum = num => { + let n = Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2)); + return Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []); +} +``` + +```js +fibonacciCountUntilNum(10) // 7 +``` + +[⬆ back to top](#table-of-contents) + +### gcd + +Calculates the greatest common divisor between two numbers. + +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`. + +```js +const gcd = (x, y) => !y ? x : gcd(y, x % y); +``` + +```js +gcd (8, 36) // 4 +``` + +[⬆ back to top](#table-of-contents) + +### hammingDistance + +Calculates the Hamming distance between two values. + +Use XOR operator (`^`) to find the bit difference between the two numbers, convert to a binary string using `toString(2)`. +Count and return the number of `1`s in the string, using `match(/1/g)`. + +```js +const hammingDistance = (num1, num2) => + ((num1 ^ num2).toString(2).match(/1/g) || '').length; +``` + +```js +hammingDistance(2,3) // 1 +``` + +[⬆ back to top](#table-of-contents) + +### inRange + +Checks if the given number falls within the given range. + +Use arithmetic comparison to check if the given number is in the specified range. +If the second parameter, `end`, is not specified, the range is considered to be from `0` to `start`. + +```js +const inRange = (n, start, end=null) => { + if(end && start > end) end = [start, start=end][0]; + return (end == null) ? (n>=0 && n=start && n + ( arr => arr.reduce( ( a, d ) => a + Math.pow( parseInt( d ), arr.length ), 0 ) == digits ? true : false )( ( digits+'' ).split( '' ) ); +``` + +```js +isArmstrongNumber(1634) // true +isArmstrongNumber(371) // true +isArmstrongNumber(56) // false +``` + +[⬆ back to top](#table-of-contents) + +### isDivisible + +Checks if the first numeric argument is divisible by the second one. + +Use the modulo operator (`%`) to check if the remainder is equal to `0`. + +```js +const isDivisible = (dividend, divisor) => dividend % divisor === 0; +``` + +```js +isDivisible(6,3) // true +``` + +[⬆ back to top](#table-of-contents) + +### isEven + +Returns `true` if the given number is even, `false` otherwise. + +Checks whether a number is odd or even using the modulo (`%`) operator. +Returns `true` if the number is even, `false` if the number is odd. + +```js +const isEven = num => num % 2 === 0; +``` + +```js +isEven(3) // false +``` + +[⬆ back to top](#table-of-contents) + +### isPrime + +Checks if the provided integer is a prime number. + +Check numbers from `2` to the square root of the given number. +Return `false` if any of them divides the given number, else return `true`, unless the number is less than `2`. + +```js +const isPrime = num => { + const boundary = Math.floor(Math.sqrt(num)); + for (var i = 2; i * i <= boundary; i++) if (num % i == 0) return false; + return num >= 2; +}; +``` + +```js +isPrime(11) // true +isPrime(12) // false +``` + +[⬆ back to top](#table-of-contents) + +### lcm + +Returns the least common multiple of two numbers. + +Use the greatest common divisor (GCD) formula and `Math.abs()` to determine the least common multiple. +The GCD formula uses recursion. + +```js +const lcm = (x, y) => { + const gcd = (x, y) => !y ? x : gcd(y, x % y); + return Math.abs(x * y) / (gcd(x, y)); +}; +``` + +```js +lcm(12,7) // 84 +``` + +[⬆ back to top](#table-of-contents) + +### median + +Returns the median of an array of numbers. + +Find the middle of the array, use `Array.sort()` to sort the values. +Return the number at the midpoint if `length` is odd, otherwise the average of the two middle numbers. + +```js +const median = arr => { + const mid = Math.floor(arr.length / 2), nums = [...arr].sort((a, b) => a - b); + return arr.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2; +}; +``` + +```js +median([5,6,50,1,-5]) // 5 +median([0,10,-2,7]) // 3.5 +``` + +[⬆ back to top](#table-of-contents) + +### palindrome + +Returns `true` if the given string is a palindrome, `false` otherwise. + +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()`. + +```js +const palindrome = str => { + const s = str.toLowerCase().replace(/[\W_]/g,''); + return s === s.split('').reverse().join(''); +} +``` + +```js +palindrome('taco cat') // true +``` + +[⬆ back to top](#table-of-contents) + +### percentile + +Uses the percentile formula to calculate how many numbers in the given array are less or equal to the given value. + +Use `Array.reduce()` to calculate how many numbers are below the value and how many are the same value and apply the percentile formula. + +```js +const percentile = (arr, val) => + 100 * arr.reduce((acc,v) => acc + (v < val ? 1 : 0) + (v === val ? 0.5 : 0), 0) / arr.length; +``` + +```js +percentile([1,2,3,4,5,6,7,8,9,10], 6) // 55 +``` + +[⬆ back to top](#table-of-contents) + +### powerset + +Returns the powerset of a given array of numbers. + +Use `Array.reduce()` combined with `Array.map()` to iterate over elements and combine into an array containing all combinations. + +```js +const powerset = arr => + arr.reduce((a, v) => a.concat(a.map(r => [v].concat(r))), [[]]); +``` + +```js +powerset([1,2]) // [[], [1], [2], [2,1]] +``` + +[⬆ back to top](#table-of-contents) + +### primes + +Generates primes up to a given number, using the Sieve of Eratosthenes. + +Generate an array from `2` to the given number. Use `Array.filter()` to filter out the values divisible by any number from `2` to the square root of the provided number. + +```js +const primes = num => { + let arr = Array.from({length:num-1}).map((x,i)=> i+2), + sqroot = Math.floor(Math.sqrt(num)), + numsTillSqroot = Array.from({length:sqroot-1}).map((x,i)=> i+2); + numsTillSqroot.forEach(x => arr = arr.filter(y => ((y%x)!==0)||(y==x))); + return arr; +} +``` + +```js +primes(10) // [2,3,5,7] +``` + +[⬆ back to top](#table-of-contents) + +### randomIntegerInRange + +Returns a random integer in the specified range. + +Use `Math.random()` to generate a random number and map it to the desired range, using `Math.floor()` to make it an integer. + +```js +const randomIntegerInRange = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; +``` + +```js +randomIntegerInRange(0, 5) // 2 +``` + +[⬆ back to top](#table-of-contents) + +### randomNumberInRange + +Returns a random number in the specified range. + +Use `Math.random()` to generate a random value, map it to the desired range using multiplication. + +```js +const randomNumberInRange = (min, max) => Math.random() * (max - min) + min; +``` + +```js +randomNumberInRange(2,10) // 6.0211363285087005 +``` + +[⬆ back to top](#table-of-contents) + +### round + +Rounds a number to a specified amount of digits. + +Use `Math.round()` and template literals to round the number to the specified number of digits. +Omit the second argument, `decimals` to round to an integer. + +```js +const round = (n, decimals=0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`); +``` + +```js +round(1.005, 2) // 1.01 +``` + +[⬆ back to top](#table-of-contents) + +### sdbmHashAlgorithm + +This algorithm is a simple hash-algorithm that hashes it input string `s` into a whole number. + +Use `split('')` and `Array.reduce()` to create a hash of the input string, utilizing bit shifting. + +``` js +const sdbm = str => { + let arr = str.split(''); + return arr.reduce((hashCode, currentVal) => + hashCode = currentVal.charCodeAt(0) + (hashCode << 6) + (hashCode << 16) - hashCode + ,0) +} +// console.log(sdbm("name")) // -3521204949 +// console.log(sdbm("age")) // 808122783 +``` + +[⬆ back to top](#table-of-contents) + +### standardDeviation + +Returns the standard deviation of an array of numbers. + +Use `Array.reduce()` to calculate the mean, variance and the sum of the variance of the values, the variance of the values, then +determine the standard deviation. +You can omit the second argument to get the sample standard deviation or set it to `true` to get the population standard deviation. + +```js +const standardDeviation = (arr, usePopulation = false) => { + const mean = arr.reduce((acc, val) => acc + val, 0) / arr.length; + return Math.sqrt( + arr.reduce((acc, val) => acc.concat(Math.pow(val - mean, 2)), []) + .reduce((acc, val) => acc + val, 0) / (arr.length - (usePopulation ? 0 : 1)) + ); +}; +``` + +```js +standardDeviation([10,2,38,23,38,23,21]) // 13.284434142114991 (sample) +standardDeviation([10,2,38,23,38,23,21], true) // 12.29899614287479 (population) +``` + +[⬆ back to top](#table-of-contents) +## Media + +### speechSynthesis + +Performs speech synthesis (experimental). + +Use `SpeechSynthesisUtterance.voice` and `window.speechSynthesis.getVoices()` to convert a message to speech. +Use `window.speechSynthesis.speak()` to play the message. + +Learn more about the [SpeechSynthesisUtterance interface of the Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesisUtterance). + +```js +const speechSynthesis = message => { + const msg = new SpeechSynthesisUtterance(message); + msg.voice = window.speechSynthesis.getVoices()[0]; + window.speechSynthesis.speak(msg); +}; +``` + +```js +speechSynthesis('Hello, World') // // plays the message +``` + +[⬆ back to top](#table-of-contents) +## Node + +### JSONToFile + +Writes a JSON object to a file. + +Use `fs.writeFile()`, template literals and `JSON.stringify()` to write a `json` object to a `.json` file. + +```js +const fs = require('fs'); +const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2)) +``` + +```js +JSONToFile({test: "is passed"}, 'testJsonFile') // writes the object to 'testJsonFile.json' +``` + +[⬆ back to top](#table-of-contents) + +### readFileLines + +Returns an array of lines from the specified file. + +Use `readFileSync` function in `fs` node package to create a `Buffer` from a file. +convert buffer to string using `toString(encoding)` function. +creating an array from contents of file by `split`ing file content line by line (each `\n`). + +```js +const fs = require('fs'); +const readFileLines = filename => fs.readFileSync(filename).toString('UTF8').split('\n'); +``` + +```js +/* +contents of test.txt : + line1 + line2 + line3 + ___________________________ +*/ +let arr = readFileLines('test.txt') +console.log(arr) // ['line1', 'line2', 'line3'] +``` + +```js +contents of test.txt : + line1 + line2 + line3 + ___________________________ +let arr = readFileLines('test.txt') +console.log(arr) // // ['line1', 'line2', 'line3'] +``` + +[⬆ back to top](#table-of-contents) +## Object + +### cleanObj + +Removes any properties except the ones specified from a JSON object. + +Use `Object.keys()` method to loop over given JSON object and deleting keys that are not `include`d in given array. +Also if you give it a special key (`childIndicator`) it will search deeply inside it to apply function to inner objects too. + +```js +const cleanObj = (obj, keysToKeep = [], childIndicator) => { + Object.keys(obj).forEach(key => { + if (key === childIndicator) { + cleanObj(obj[key], keysToKeep, childIndicator); + } else if (!keysToKeep.includes(key)) { + delete obj[key]; + } +  }); + return obj; +}; +``` + +```js +const testObj = {a: 1, b: 2, children: {a: 1, b: 2}} +cleanObj(testObj, ["a"],"children") // { a: 1, children : { a: 1}} +``` + +[⬆ back to top](#table-of-contents) + +### objectFromPairs + +Creates an object from the given key-value pairs. + +Use `Array.reduce()` to create and combine key-value pairs. + +```js +const objectFromPairs = arr => arr.reduce((a, v) => (a[v[0]] = v[1], a), {}); +``` + +```js +objectFromPairs([['a',1],['b',2]]) // {a: 1, b: 2} +``` + +[⬆ back to top](#table-of-contents) + +### objectToPairs + +Creates an array of key-value pair arrays from an object. + +Use `Object.keys()` and `Array.map()` to iterate over the object's keys and produce an array with key-value pairs. + +```js +const objectToPairs = obj => Object.keys(obj).map(k => [k, obj[k]]); +``` + +```js +objectToPairs({a: 1, b: 2}) // [['a',1],['b',2]]) +``` + +[⬆ back to top](#table-of-contents) + +### orderBy + +Returns a sorted array of objects ordered by properties and orders. + +Uses a custom implementation of sort, that reduces the props array argument with a default value of 0, it uses destructuring to swap the properties position depending on the order passed. +If no orders array is passed it sort by 'asc' by default. + +```js +const orderBy = (arr, props, orders) => + arr.sort((a, b) => + props.reduce((acc, prop, i) => { + if (acc === 0) { + const [p1, p2] = orders && orders[i] === 'desc' ? [b[prop], a[prop]] : [a[prop], b[prop]]; + acc = p1 > p2 ? 1 : p1 < p2 ? -1 : 0; + } + return acc; + }, 0) + ); +``` + +```js +const users = [{ 'name': 'fred', 'age': 48 },{ 'name': 'barney', 'age': 36 }, + { 'name': 'fred', 'age': 40 },{ 'name': 'barney', 'age': 34 }]; +orderby(users, ['name', 'age'], ['asc', 'desc']) // [{name: 'barney', age: 36}, {name: 'barney', age: 34}, {name: 'fred', age: 48}, {name: 'fred', age: 40}] +orderby(users, ['name', 'age']) // [{name: 'barney', age: 34}, {name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}] +``` + +[⬆ back to top](#table-of-contents) + +### select + +Retrieve a property that indicated by the selector from an object. + +If the property does not exists returns `undefined`. + +```js +const select = (from, selector) => + selector.split('.').reduce((prev, cur) => prev && prev[cur], from); +``` + +```js +const obj = {selector: {to: {val: 'val to select'}}}; +select(obj, 'selector.to.val'); // 'val to select' +``` + +[⬆ back to top](#table-of-contents) + +### shallowClone + +Creates a shallow clone of an object. + +Use `Object.assign()` and an empty object (`{}`) to create a shallow clone of the original. + +```js +const shallowClone = obj => Object.assign({}, obj); +``` + +```js +const a = { x: true, y: 1 }; +const b = shallowClone(a); +a === b // false +``` + +[⬆ back to top](#table-of-contents) + +### truthCheckCollection + +Checks if the predicate (second argument) is truthy on all elements of a collection (first argument). + +Use `Array.every()` to check if each passed object has the specified property and if it returns a truthy value. + + ```js +const truthCheckCollection = (collection, pre) => (collection.every(obj => obj[pre])); +``` + +```js +truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") // true +``` + +[⬆ back to top](#table-of-contents) +## String + +### anagrams + +Generates all anagrams of a string (contains duplicates). + +Use recursion. +For each letter in the given string, create all the partial anagrams for the rest of its letters. +Use `Array.map()` to combine the letter with each partial anagram, then `Array.reduce()` to combine all anagrams in one array. +Base cases are for string `length` equal to `2` or `1`. + +```js +const anagrams = str => { + if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str]; + return str.split('').reduce((acc, letter, i) => + acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)), []); +}; +``` + +```js +anagrams('abc') // ['abc','acb','bac','bca','cab','cba'] +``` + +[⬆ back to top](#table-of-contents) + +### Capitalize + +Capitalizes the first letter of a string. + +Use destructuring and `toUpperCase()` to capitalize first letter, `...rest` to get array of characters after first letter and then `Array.join('')` to make it a string again. +Omit the `lowerRest` parameter to keep the rest of the string intact, or set it to `true` to convert to lowercase. + +```js +const capitalize = ([first, ...rest], lowerRest = false) => + first.toUpperCase() + (lowerRest ? rest.join('').toLowerCase() : rest.join('')); +``` + +```js +capitalize('fooBar') // 'FooBar' +capitalize('fooBar', true) // 'Foobar' +``` + +[⬆ back to top](#table-of-contents) + +### capitalizeEveryWord + +Capitalizes the first letter of every word in a string. + +Use `replace()` to match the first character of each word and `toUpperCase()` to capitalize it. + +```js +const capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase()); +``` + +```js +capitalizeEveryWord('hello world!') // 'Hello World!' +``` + +[⬆ back to top](#table-of-contents) + +### countVowels + +Retuns `number` of vowels in provided string. + +Use a regular expression to count the number of vowels `(A, E, I, O, U)` in a `string`. + +```js +const countVowels = str => (str.match(/[aeiou]/ig) || []).length; +``` + +```js +countVowels('foobar') // 3 +countVowels('gym') // 0 +``` + +[⬆ back to top](#table-of-contents) + +### escapeRegExp + +Escapes a string to use in a regular expression. + +Use `replace()` to escape special characters. + +```js +const escapeRegExp = str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +``` + +```js +escapeRegExp('(test)') // \\(test\\) +``` + +[⬆ back to top](#table-of-contents) + +### fromCamelCase + +Converts a string from camelcase. + +Use `replace()` to remove underscores, hyphens, and spaces and convert words to camelcase. +Omit the second argument to use a default separator of `_`. + +```js +const fromCamelCase = (str, separator = '_') => + str.replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2') + .replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + separator + '$2').toLowerCase(); +``` + +```js +fromCamelCase('someDatabaseFieldName', ' ') // 'some database field name' +fromCamelCase('someLabelThatNeedsToBeCamelized', '-') // 'some-label-that-needs-to-be-camelized' +fromCamelCase('someJavascriptProperty', '_') // 'some_javascript_property' +``` + +[⬆ back to top](#table-of-contents) + +### repeatString + +Repeats a string n times using `String.repeat()` + +If no string is provided the default is `""` and the default number of times is 2. + +```js +const repeatString = (str="",num=2) => { + return num >= 0 ? str.repeat(num) : str; +} +``` + +```js +repeatString("abc",3) // 'abcabcabc' +repeatString("abc") // 'abcabc' +``` + +[⬆ back to top](#table-of-contents) + +### reverseString + +Reverses a string. + +Use `split('')` and `Array.reverse()` to reverse the order of the characters in the string. +Combine characters to get a string using `join('')`. + +```js +const reverseString = str => str.split('').reverse().join(''); +``` + +```js +reverseString('foobar') // 'raboof' +``` + +[⬆ back to top](#table-of-contents) + +### sortCharactersInString + +Alphabetically sorts the characters in a string. + +Split the string using `split('')`, `Array.sort()` utilizing `localeCompare()`, recombine using `join('')`. + +```js +const sortCharactersInString = str => + str.split('').sort((a, b) => a.localeCompare(b)).join(''); +``` + +```js +sortCharactersInString('cabbage') // 'aabbceg' +``` + +[⬆ back to top](#table-of-contents) + +### toCamelCase + +Converts a string to camelcase. + +Break the string into words and combine them capitalizing the first letter of each word. +For more detailed explanation of this Regex, [visit this Site](https://regex101.com/r/bMCgAB/1). + +```js +const toCamelCase = str => { + let s = str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) + .map(x => x.slice(0, 1).toUpperCase() + x.slice(1).toLowerCase()) + .join(''); + return s.slice(0,1).toLowerCase() + s.slice(1) + } +``` + +```js +toCamelCase("some_database_field_name") // 'someDatabaseFieldName' +toCamelCase("Some label that needs to be camelized") // 'someLabelThatNeedsToBeCamelized' +toCamelCase("some-javascript-property") // 'someJavascriptProperty' +toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") // 'someMixedStringWithSpacesUnderscoresAndHyphens' +``` + +[⬆ back to top](#table-of-contents) + +### toKebabCase + +Converts a string to kebab case. + +Break the string into words and combine them using `-` as a separator. +For more detailed explanation of this Regex, [visit this Site](https://regex101.com/r/bMCgAB/1). + +```js +const toKebabCase = str => + str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) + .map(x => x.toLowerCase()) + .join('-'); +``` + +```js +toKebabCase("camelCase") // 'camel-case' +toKebabCase("some text") // 'some-text' +toKebabCase("some-mixed_string With spaces_underscores-and-hyphens") // 'some-mixed-string-with-spaces-underscores-and-hyphens' +toKebabCase("AllThe-small Things") // "all-the-small-things" +toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') // "i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-xml-and-html" +``` + +[⬆ back to top](#table-of-contents) + +### toSnakeCase + +Converts a string to snake case. + +Break the string into words and combine them using `_` as a separator. +For more detailed explanation of this Regex, [visit this Site](https://regex101.com/r/bMCgAB/1). + +```js +const toSnakeCase = str => { + str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) + .map(x => x.toLowerCase()) + .join('_'); +}; +``` + +```js +toSnakeCase("camelCase") // 'camel_case' +toSnakeCase("some text") // 'some_text' +toSnakeCase("some-javascript-property") // 'some_javascript_property' +toSnakeCase("some-mixed_string With spaces_underscores-and-hyphens") // 'some_mixed_string_with_spaces_underscores_and_hyphens' +toSnakeCase("AllThe-small Things") // "all_the_smal_things" +toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') // "i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html" +``` + +[⬆ back to top](#table-of-contents) + +### truncateString + +Truncates a string up to a specified length. + +Determine if the string's `length` is greater than `num`. +Return the string truncated to the desired length, with `...` appended to the end or the original string. + +```js +const truncateString = (str, num) => + str.length > num ? str.slice(0, num > 3 ? num - 3 : num) + '...' : str; +``` + +```js +truncateString('boomerang', 7) // 'boom...' +``` + +[⬆ back to top](#table-of-contents) + +### words + +Converts a given string into an array of words. + +Use `String.split()` with a supplied pattern (defaults to non-alpha as a regex) to convert to an array of strings. Use `Array.filter()` to remove any empty strings. +Omit the second argument to use the default regex. + +```js +const words = (str, pattern = /[^a-zA-Z-]+/) => str.split(pattern).filter(Boolean); +``` + +```js +words("I love javaScript!!") // ["I", "love", "javaScript"] +words("python, javaScript & coffee") // ["python", "javaScript", "coffee"] +``` + +[⬆ back to top](#table-of-contents) +## Utility + +### coalesce + +Returns the first non-null/undefined argument. + +Use `Array.find()` to return the first non `null`/`undefined` argument. + +```js +const coalesce = (...args) => args.find(_ => ![undefined, null].includes(_)) +``` + +```js +coalesce(null,undefined,"",NaN, "Waldo") // "" +``` + +[⬆ back to top](#table-of-contents) + +### coalesceFactory + +Returns a customized coalesce function that returns the first argument that returns `true` from the provided argument validation function. + +Use `Array.find()` to return the first argument that returns `true` from the provided argument validation function. + +```js +const coalesceFactory = valid => (...args) => args.find(valid); +``` + +```js +const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_)) +customCoalesce(undefined, null, NaN, "", "Waldo") // "Waldo" +``` + +[⬆ back to top](#table-of-contents) + +### extendHex + +Extends a 3-digit color code to a 6-digit color code. + +Use `Array.map()`, `split()` and `Array.join()` to join the mapped array for converting a 3-digit RGB notated hexadecimal color-code to the 6-digit form. +`String.slice()` is used to remove `#` from string start since it's added once. +```js +const extendHex = shortHex => + '#' + shortHex.slice(shortHex.startsWith('#') ? 1 : 0).split('').map(x => x+x).join('') +``` + +```js +extendHex('#03f') // '#0033ff' +extendHex('05a') // '#0055aa' +``` + +[⬆ back to top](#table-of-contents) + +### getType + +Returns the native type of a value. + +Returns lowercased constructor name of value, "undefined" or "null" if value is undefined or null + +```js +const getType = v => + v === undefined ? 'undefined' : v === null ? 'null' : v.constructor.name.toLowerCase(); +``` + +```js +getType(new Set([1,2,3])) // "set" +``` + +[⬆ back to top](#table-of-contents) + +### hexToRGB + +Converts a color code to a `rgb()` or `rgba()` string if alpha value is provided. + +Use bitwise right-shift operator and mask bits with `&` (and) operator to convert a hexadecimal color code (with or without prefixed with `#`) to a string with the RGB values. If it's 3-digit color code, first convert to 6-digit version. If an alpha value is provided alongside 6-digit hex, give `rgba()` string in return. + +```js +const hexToRGB = hex => { + let alpha = false, h = hex.slice(hex.startsWith('#') ? 1 : 0); + if (h.length === 3) h = [...h].map(x => x + x).join(''); + else if (h.length === 8) alpha = true; + h = parseInt(h, 16); + return 'rgb' + (alpha ? 'a' : '') + '(' + + (h >>> (alpha ? 24 : 16)) + ', ' + + ((h & (alpha ? 0x00ff0000 : 0x00ff00)) >>> (alpha ? 16 : 8)) + ', ' + + ((h & (alpha ? 0x0000ff00 : 0x0000ff)) >>> (alpha ? 8 : 0)) + + (alpha ? `, ${(h & 0x000000ff)}` : '') + ')'; +}; +``` + +```js +hexToRGB('#27ae60ff') // 'rgba(39, 174, 96, 255)' +hexToRGB('27ae60') // 'rgb(39, 174, 96)' +hexToRGB('#fff') // 'rgb(255, 255, 255)' +``` + +[⬆ back to top](#table-of-contents) + +### isArray + +Checks if the given argument is an array. + +Use `Array.isArray()` to check if a value is classified as an array. + +```js +const isArray = val => !!val && Array.isArray(val); +``` + +```js +isArray(null) // false +isArray([1]) // true +``` + +[⬆ back to top](#table-of-contents) + +### isBoolean + +Checks if the given argument is a native boolean element. + +Use `typeof` to check if a value is classified as a boolean primitive. + +```js +const isBoolean = val => typeof val === 'boolean'; +``` + +```js +isBoolean(null) // false +isBoolean(false) // true +``` + +[⬆ back to top](#table-of-contents) + +### isFunction + +Checks if the given argument is a function. + +Use `typeof` to check if a value is classified as a function primitive. + +```js +const isFunction = val => val && typeof val === 'function'; +``` + +```js +isFunction('x') // false +isFunction(x => x) // true +``` + +[⬆ back to top](#table-of-contents) + +### isNumber + +Checks if the given argument is a number. + +Use `typeof` to check if a value is classified as a number primitive. + +```js +const isNumber = val => typeof val === 'number'; +``` + +```js +isNumber('1') // false +isNumber(1) // true +``` +[⬆ back to top](#table-of-contents) + +### isString + +Checks if the given argument is a string. + +Use `typeof` to check if a value is classified as a string primitive. + +```js +const isString = val => typeof val === 'string'; +``` + +```js +isString(10) // false +isString('10') // true +``` + +[⬆ back to top](#table-of-contents) + +### isSymbol + +Checks if the given argument is a symbol. + +Use `typeof` to check if a value is classified as a symbol primitive. + +```js +const isSymbol = val => typeof val === 'symbol'; +``` + +```js +isSymbol('x') // false +isSymbol(Symbol('x')) // true +``` + +[⬆ back to top](#table-of-contents) + +### randomHexColor + +Generates a random hexadecimal color code. + +Use `Math.random` to generate a random 24-bit(6x4bits) hexadecimal number. Use bit shifting and then convert it to an hexadecimal String using `toString(16)`. + +```js +const randomHexColor = () => { + let n = (Math.random() * 0xfffff | 0).toString(16); + return '#' + (n.length !== 6 + ? (Math.random() * 0xf | 0).toString(16) + n : n); +}; +``` + +```js +randomHexColorCode() // "#e34155" +randomHexColorCode() // "#fd73a6" +randomHexColorCode() // "#4144c6" +``` + +[⬆ back to top](#table-of-contents) + +### RGBToHex + +Converts the values of RGB components to a color code. + +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. + +```js +const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0'); +``` + +```js +RGBToHex(255, 165, 1) // 'ffa501' +``` + +[⬆ back to top](#table-of-contents) + +### timeTaken + +Measures the time taken by a function to execute. + +Use `console.time()` and `console.timeEnd()` to measure the difference between the start and end times to determine how long the callback took to execute. + +```js +const timeTaken = callback => { + console.time('timeTaken'); const r = callback(); + console.timeEnd('timeTaken'); return r; +}; +``` + +```js +timeTaken(() => Math.pow(2, 10)) // 1024 +(logged): timeTaken: 0.02099609375ms +``` + +[⬆ back to top](#table-of-contents) + +### toDecimalMark + +Use `toLocaleString()` to convert a float-point arithmetic to the [Decimal mark](https://en.wikipedia.org/wiki/Decimal_mark) form. It makes a comma separated string from a number. + + ```js +const toDecimalMark = num => num.toLocaleString("en-US"); +``` + +```js +toDecimalMark(12305030388.9087) // "12,305,030,388.9087" +``` + +[⬆ back to top](#table-of-contents) + +### toOrdinalSuffix + +Adds an ordinal suffix to a number. + +Use the modulo operator (`%`) to find values of single and tens digits. +Find which ordinal pattern digits match. +If digit is found in teens pattern, use teens ordinal. + +```js +const toOrdinalSuffix = num => { + const int = parseInt(num), digits = [(int % 10), (int % 100)], + ordinals = ['st', 'nd', 'rd', 'th'], oPattern = [1, 2, 3, 4], + tPattern = [11, 12, 13, 14, 15, 16, 17, 18, 19]; + return oPattern.includes(digits[0]) && !tPattern.includes(digits[1]) ? int + ordinals[digits[0] - 1] : int + ordinals[3]; +}; +``` + +```js +toOrdinalSuffix("123") // "123rd" +``` + +[⬆ back to top](#table-of-contents) + +### UUIDGenerator + +Generates a UUID. + +Use `crypto` API to generate a UUID, compliant with [RFC4122](https://www.ietf.org/rfc/rfc4122.txt) version 4. + +```js +const UUIDGenerator = () => + ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => + (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) + ); +``` + +```js +UUIDGenerator() // '7982fcfe-5721-4632-bede-6000885be57d' +``` + +[⬆ back to top](#table-of-contents) + +### validateNumber + +Returns `true` if the given value is a number, `false` otherwise. + +Use `!isNaN` in combination with `parseFloat()` to check if the argument is a number. +Use `isFinite()` to check if the number is finite. +Use `Number()` to check if the coercion holds. + +```js +const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n; +``` + +```js +validateNumber('10') // true +``` + +[⬆ back to top](#table-of-contents) + +## Credits + +*Icons made by [Smashicons](https://www.flaticon.com/authors/smashicons) from [www.flaticon.com](https://www.flaticon.com/) is licensed by [CC 3.0 BY](http://creativecommons.org/licenses/by/3.0/).* -### arrayGcd - -Calculates the greatest common denominator (gcd) of an array of numbers. - -Use `Array.reduce()` and the `gcd` formula (uses recursion) to calculate the greatest common denominator of an array of numbers. - -```js -const arrayGcd = arr => { - const gcd = (x, y) => !y ? x : gcd(y, x % y); - return arr.reduce((a,b) => gcd(a,b)); -} -``` - -```js -arrayGcd([1,2,3,4,5]) -> 1 -arrayGcd([4,8,12]) -> 4 -``` - -[⬆ back to top](#table-of-contents) - -### arrayLcm - -Calculates the lowest common multiple (lcm) of an array of numbers. - -Use `Array.reduce()` and the `lcm` formula (uses recursion) to calculate the lowest common multiple of an array of numbers. - -```js -const arrayLcm = arr => { - const gcd = (x, y) => !y ? x : gcd(y, x % y); - const lcm = (x, y) => (x*y)/gcd(x, y); - return arr.reduce((a,b) => lcm(a,b)); -} -``` - -```js -arrayLcm([1,2,3,4,5]) -> 60 -arrayLcm([4,8,12]) -> 24 -``` - -[⬆ back to top](#table-of-contents) - -### arrayMax - -Returns the maximum value in an array. - -Use `Math.max()` combined with the spread operator (`...`) to get the maximum value in the array. - -```js -const arrayMax = arr => Math.max(...arr); -``` - -```js -arrayMax([10, 1, 5]) -> 10 -``` - -[⬆ back to top](#table-of-contents) - -### arrayMin - -Returns the minimum value in an array. - -Use `Math.min()` combined with the spread operator (`...`) to get the minimum value in the array. - -```js -const arrayMin = arr => Math.min(...arr); -``` - -```js -arrayMin([10, 1, 5]) -> 1 -``` - -[⬆ back to top](#table-of-contents) - -### chunk - -Chunks an array into smaller arrays of a specified size. - -Use `Array.from()` to create a new array, that fits the number of chunks that will be produced. -Use `Array.slice()` to map each element of the new array to a chunk the length of `size`. -If the original array can't be split evenly, the final chunk will contain the remaining elements. - -```js -const chunk = (arr, size) => - Array.from({length: Math.ceil(arr.length / size)}, (v, i) => arr.slice(i * size, i * size + size)); -``` - -```js -chunk([1,2,3,4,5], 2) -> [[1,2],[3,4],[5]] -``` - -[⬆ back to top](#table-of-contents) - -### compact - -Removes falsey values from an array. - -Use `Array.filter()` to filter out falsey values (`false`, `null`, `0`, `""`, `undefined`, and `NaN`). - -```js -const compact = arr => arr.filter(Boolean); -``` - -```js -compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) -> [ 1, 2, 3, 'a', 's', 34 ] -``` - -[⬆ back to top](#table-of-contents) - -### countOccurrences - -Counts the occurrences of a value in an array. - -Use `Array.reduce()` to increment a counter each time you encounter the specific value inside the array. - -```js -const countOccurrences = (arr, value) => arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0); -``` - -```js -countOccurrences([1,1,2,1,2,3], 1) -> 3 -``` - -[⬆ back to top](#table-of-contents) - -### deepFlatten - -Deep flattens an array. - -Use recursion. -Use `Array.concat()` with an empty array (`[]`) and the spread operator (`...`) to flatten an array. -Recursively flatten each element that is an array. - -```js -const deepFlatten = arr => [].concat(...arr.map(v => Array.isArray(v) ? deepFlatten(v) : v)); -``` - -```js -deepFlatten([1,[2],[[3],4],5]) -> [1,2,3,4,5] -``` - -[⬆ back to top](#table-of-contents) - -### difference - -Returns the difference between two arrays. - -Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values not contained in `b`. - -```js -const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); }; -``` - -```js -difference([1,2,3], [1,2,4]) -> [3] -``` - -[⬆ back to top](#table-of-contents) - -### differenceWith - -Filters out all values from an array for which the comparator function does not return `true`. - -Use `Array.filter()` and `Array.find()` to find the appropriate values. - -```js -const differenceWith = (arr, val, comp) => arr.filter(a => !val.find(b => comp(a, b))) -``` - -```js -differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) -> [1, 1.2] -``` - -[⬆ back to top](#table-of-contents) - -### distinctValuesOfArray - -Returns all the distinct values of an array. - -Use ES6 `Set` and the `...rest` operator to discard all duplicated values. - -```js -const distinctValuesOfArray = arr => [...new Set(arr)]; -``` - -```js -distinctValuesOfArray([1,2,2,3,4,4,5]) -> [1,2,3,4,5] -``` - -[⬆ back to top](#table-of-contents) - -### dropElements - -Removes elements in an array until the passed function returns `true`. Returns the remaining elements in the array. - -Loop through the array, using `Array.slice()` to drop the first element of the array until the returned value from the function is `true`. -Returns the remaining elements. - -```js -const dropElements = (arr, func) => { - while (arr.length > 0 && !func(arr[0])) arr = arr.slice(1); - return arr; -}; -``` - -```js -dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4] -``` - -[⬆ back to top](#table-of-contents) - -### dropRight - -Returns a new array with `n` elements removed from the right. - -Use `Array.slice()` to slice the remove the specified number of elements from the right. - -```js -const dropRight = (arr, n = 1) => arr.slice(0, -n); -``` - -```js -dropRight([1,2,3]) -> [1,2] -dropRight([1,2,3], 2) -> [1] -dropRight([1,2,3], 42) -> [] -``` - -[⬆ back to top](#table-of-contents) - -### everyNth - -Returns every nth element in an array. - -Use `Array.filter()` to create a new array that contains every nth element of a given array. - -```js -const everyNth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1); -``` - -```js -everyNth([1,2,3,4,5,6], 2) -> [ 2, 4, 6 ] -``` - -[⬆ back to top](#table-of-contents) - -### filterNonUnique - -Filters out the non-unique values in an array. - -Use `Array.filter()` for an array containing only the unique values. - -```js -const filterNonUnique = arr => arr.filter(i => arr.indexOf(i) === arr.lastIndexOf(i)); -``` - -```js -filterNonUnique([1,2,2,3,4,4,5]) -> [1,3,5] -``` - -[⬆ back to top](#table-of-contents) - -### flatten - -Flattens an array. - -Use a new array and concatenate it with the spread input array causing a shallow denesting of any contained arrays. - -```js -const flatten = arr => [ ].concat( ...arr ); -``` - -```js -flatten([1,[2],3,4]) -> [1,2,3,4] -``` - -[⬆ back to top](#table-of-contents) - -### flattenDepth - -Flattens an array up to the specified depth. - -Use recursion, decrementing `depth` by 1 for each level of depth. -Use `Array.reduce()` and `Array.concat()` to merge elements or arrays. -Base case, for `depth` equal to `1` stops recursion. -Omit the second element, `depth` to flatten only to a depth of `1` (single flatten). - -```js -const flattenDepth = (arr, depth = 1) => - depth != 1 ? arr.reduce((a, v) => a.concat(Array.isArray(v) ? flattenDepth(v, depth - 1) : v), []) - : arr.reduce((a, v) => a.concat(v), []); -``` - -```js -flatten([1,[2],3,4]) -> [1,2,3,4] -``` - -[⬆ back to top](#table-of-contents) - -### groupBy - -Groups the elements of an array based on the given function. - -Use `Array.map()` to map the values of an array to a function or property name. -Use `Array.reduce()` to create an object, where the keys are produced from the mapped results. - -```js -const groupBy = (arr, func) => - arr.map(typeof func === 'function' ? func : val => val[func]) - .reduce((acc, val, i) => { acc[val] = (acc[val] || []).concat(arr[i]); return acc; }, {}); -``` - -```js -groupBy([6.1, 4.2, 6.3], Math.floor) -> {4: [4.2], 6: [6.1, 6.3]} -groupBy(['one', 'two', 'three'], 'length') -> {3: ['one', 'two'], 5: ['three']} -``` - -[⬆ back to top](#table-of-contents) - -### head - -Returns the head of a list. - -Use `arr[0]` to return the first element of the passed array. - -```js -const head = arr => arr[0]; -``` - -```js -head([1,2,3]) -> 1 -``` - -[⬆ back to top](#table-of-contents) - -### initial - -Returns all the elements of an array except the last one. - -Use `arr.slice(0,-1)` to return all but the last element of the array. - -```js -const initial = arr => arr.slice(0, -1); -``` - -```js -initial([1,2,3]) -> [1,2] -``` - -[⬆ back to top](#table-of-contents) - -### initialize2DArray - -Initializes a 2D array of given width and height and value. - -Use `Array.map()` to generate h rows where each is a new array of size w initialize with value. If the value is not provided, default to `null`. - -```js -const initialize2DArray = (w, h, val = null) => Array(h).fill().map(() => Array(w).fill(val)); -``` - -```js -initialize2DArray(2, 2, 0) -> [[0,0], [0,0]] -``` - -[⬆ back to top](#table-of-contents) - -### initializeArrayWithRange - -Initializes an array containing the numbers in the specified range where `start` and `end` are inclusive. - -Use `Array((end + 1) - start)` to create an array of the desired length, `Array.map()` to fill with the desired values in a range. -You can omit `start` to use a default value of `0`. - -```js -const initializeArrayWithRange = (end, start = 0) => - Array.from({ length: (end + 1) - start }).map((v, i) => i + start); -``` - -```js -initializeArrayWithRange(5) -> [0,1,2,3,4,5] -initializeArrayWithRange(7, 3) -> [3,4,5,6,7] -``` - -[⬆ back to top](#table-of-contents) - -### initializeArrayWithValues - -Initializes and fills an array with the specified values. - -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`. - -```js -const initializeArrayWithValues = (n, value = 0) => Array(n).fill(value); -``` - -```js -initializeArrayWithValues(5, 2) -> [2,2,2,2,2] -``` - -[⬆ back to top](#table-of-contents) - -### intersection - -Returns a list of elements that exist in both arrays. - -Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values contained in `b`. - -```js -const intersection = (a, b) => { const s = new Set(b); return a.filter(x => s.has(x)); }; -``` - -```js -intersection([1,2,3], [4,3,2]) -> [2,3] -``` - -[⬆ back to top](#table-of-contents) - -### last - -Returns the last element in an array. - -Use `arr.length - 1` to compute the index of the last element of the given array and returning it. - -```js -const last = arr => arr[arr.length - 1]; -``` - -```js -last([1,2,3]) -> 3 -``` - -[⬆ back to top](#table-of-contents) - -### mapObject - -Maps the values of an array to an object using a function, where the key-value pairs consist of the original value as the key and the mapped value. - -Use an anonymous inner function scope to declare an undefined memory space, using closures to store a return value. Use a new `Array` to store the array with a map of the function over its data set and a comma operator to return a second step, without needing to move from one context to another (due to closures and order of operations). - -```js -const mapObject = (arr, fn) => - (a => (a = [arr, arr.map(fn)], a[0].reduce( (acc,val,ind) => (acc[val] = a[1][ind], acc), {}) )) ( ); -``` - -```js -const squareIt = arr => mapObject(arr, a => a*a) -squareIt([1,2,3]) // { 1: 1, 2: 4, 3: 9 } -``` - -[⬆ back to top](#table-of-contents) - -### nthElement - -Returns the nth element of an array. - -Use `Array.slice()` to get an array containing the nth element at the first place. -If the index is out of bounds, return `[]`. -Omit the second argument, `n`, to get the first element of the array. - -```js -const nthElement = (arr, n=0) => (n>0? arr.slice(n,n+1) : arr.slice(n))[0]; -``` - -```js -nthElement(['a','b','c'],1) -> 'b' -nthElement(['a','b','b'],-3) -> 'a' -``` - -[⬆ back to top](#table-of-contents) - -### pick - -Picks the key-value pairs corresponding to the given keys from an object. - -Use `Array.reduce()` to convert the filtered/picked keys back to an object with the corresponding key-value pair if the key exists in the obj. - -```js -const pick = (obj, arr) => - arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {}); -``` - -```js -pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) -> { 'a': 1, 'c': 3 } -``` - -[⬆ back to top](#table-of-contents) - -### pull - -Mutates the original array to filter out the values specified. - -Use `Array.filter()` and `Array.includes()` to pull out the values that are not needed. -Use `Array.length = 0` to mutate the passed in an array by resetting it's length to zero and `Array.push()` to re-populate it with only the pulled values. - -_(For a snippet that does not mutate the original array see [`without`](#without))_ - -```js -const pull = (arr, ...args) => { - let argState = Array.isArray(args[0]) ? args[0] : args; - let pulled = arr.filter((v, i) => !argState.includes(v)); - arr.length = 0; - pulled.forEach(v => arr.push(v)); -}; -``` - -```js -let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c']; -pull(myArray1, 'a', 'c'); -console.log(myArray1) -> [ 'b', 'b' ] - -let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c']; -pull(myArray2, ['a', 'c']); -console.log(myArray2) -> [ 'b', 'b' ] -``` - -[⬆ back to top](#table-of-contents) - -### pullAtIndex - -Mutates the original array to filter out the values at the specified indexes. - -Use `Array.filter()` and `Array.includes()` to pull out the values that are not needed. -Use `Array.length = 0` to mutate the passed in an array by resetting it's length to zero and `Array.push()` to re-populate it with only the pulled values. -Use `Array.push()` to keep track of pulled values - -```js -const pullAtIndex = (arr, pullArr) => { - let removed = []; - let pulled = arr.map((v, i) => pullArr.includes(i) ? removed.push(v) : v) - .filter((v, i) => !pullArr.includes(i)) - arr.length = 0; - pulled.forEach(v => arr.push(v)); - return removed; -} -``` - -```js -let myArray = ['a', 'b', 'c', 'd']; -let pulled = pullAtIndex(myArray, [1, 3]); - -console.log(myArray); -> [ 'a', 'c' ] -console.log(pulled); -> [ 'b', 'd' ] -``` - -[⬆ back to top](#table-of-contents) - -### pullAtValue - -Mutates the original array to filter out the values specified. Returns the removed elements. - -Use `Array.filter()` and `Array.includes()` to pull out the values that are not needed. -Use `Array.length = 0` to mutate the passed in an array by resetting it's length to zero and `Array.push()` to re-populate it with only the pulled values. -Use `Array.push()` to keep track of pulled values - -```js -const pullAtValue = (arr, pullArr) => { - let removed = [], - pushToRemove = arr.forEach((v, i) => pullArr.includes(v) ? removed.push(v) : v), - mutateTo = arr.filter((v, i) => !pullArr.includes(v)); - arr.length = 0; - mutateTo.forEach(v => arr.push(v)); - return removed; -} -``` - -```js -let myArray = ['a', 'b', 'c', 'd']; -let pulled = pullAtValue(myArray, ['b', 'd']); -console.log(myArray); -> [ 'a', 'c' ] -console.log(pulled); -> [ 'b', 'd' ] -``` - -[⬆ back to top](#table-of-contents) - -### remove - -Removes elements from an array for which the given function returns `false`. - -Use `Array.filter()` to find array elements that return truthy values and `Array.reduce()` to remove elements using `Array.splice()`. -The `func` is invoked with three arguments (`value, index, array`). - -```js -const remove = (arr, func) => - Array.isArray(arr) ? arr.filter(func).reduce((acc, val) => { - arr.splice(arr.indexOf(val), 1); return acc.concat(val); - }, []) - : []; -``` - -```js -remove([1, 2, 3, 4], n => n % 2 == 0) -> [2, 4] -``` - -[⬆ back to top](#table-of-contents) - -### sample - -Returns a random element from an array. - -Use `Math.random()` to generate a random number, multiply it by `length` and round it of to the nearest whole number using `Math.floor()`. -This method also works with strings. - -```js -const sample = arr => arr[Math.floor(Math.random() * arr.length)]; -``` - -```js -sample([3, 7, 9, 11]) -> 9 -``` - -[⬆ back to top](#table-of-contents) - -### shuffle - -Randomizes the order of the values of an array, returning a new array. - -Uses the Fisher-Yates algoritm to reorder the elements of the array, based on the [Lodash implementation](https://github.com/lodash/lodash/blob/b2ea6b1cd251796dcb5f9700c4911a7b6223920b/shuffle.js), but as a pure function. - -```js -const shuffle = arr => arr.sort(() => Math.random() - 0.5); -``` - -```js -shuffle([1,2,3]) -> [2,3,1] -``` - -[⬆ back to top](#table-of-contents) - -### similarity - -Returns an array of elements that appear in both arrays. - -Use `filter()` to remove values that are not part of `values`, determined using `includes()`. - -```js -const similarity = (arr, values) => arr.filter(v => values.includes(v)); -``` - -```js -similarity([1,2,3], [1,2,4]) -> [1,2] -``` - -[⬆ back to top](#table-of-contents) - -### symmetricDifference - -Returns the symmetric difference between two arrays. - -Create a `Set` from each array, then use `Array.filter()` on each of them to only keep values not contained in the other. - -```js -const symmetricDifference = (a, b) => { - const sA = new Set(a), sB = new Set(b); - return [...a.filter(x => !sB.has(x)), ...b.filter(x => !sA.has(x))]; -} -``` - -```js -symmetricDifference([1,2,3], [1,2,4]) -> [3,4] -``` - -[⬆ back to top](#table-of-contents) - -### tail - -Returns all elements in an array except for the first one. - -Return `arr.slice(1)` if the array's `length` is more than `1`, otherwise, return the whole array. - -```js -const tail = arr => arr.length > 1 ? arr.slice(1) : arr; -``` - -```js -tail([1,2,3]) -> [2,3] -tail([1]) -> [1] -``` - -[⬆ back to top](#table-of-contents) - -### take - -Returns an array with n elements removed from the beginning. - -Use `Array.slice()` to create a slice of the array with `n` elements taken from the beginning. - -```js -const take = (arr, n = 1) => arr.slice(0, n); -``` - -```js -take([1, 2, 3], 5) -> [1, 2, 3] -take([1, 2, 3], 0) -> [] -``` - -[⬆ back to top](#table-of-contents) - -### takeRight - -Returns an array with n elements removed from the end. - -Use `Array.slice()` to create a slice of the array with `n` elements taken from the end. - -```js -const takeRight = (arr, n = 1) => arr.slice(arr.length - n, arr.length); -``` - -```js -takeRight([1, 2, 3], 2) -> [ 2, 3 ] -takeRight([1, 2, 3]) -> [3] -``` - -[⬆ back to top](#table-of-contents) - -### union - -Returns every element that exists in any of the two arrays once. - -Create a `Set` with all values of `a` and `b` and convert to an array. - -```js -const union = (a, b) => Array.from(new Set([...a, ...b])); -``` - -```js -union([1,2,3], [4,3,2]) -> [1,2,3,4] -``` - -[⬆ back to top](#table-of-contents) - -### without - -Filters out the elements of an array, that have one of the specified values. - -Use `Array.filter()` to create an array excluding(using `!Array.includes()`) all given values. - -_(For a snippet that mutates the original array see [`pull`](#pull))_ - -```js -const without = (arr, ...args) => arr.filter(v => !args.includes(v)); -``` - -```js -without([2, 1, 2, 3], 1, 2) -> [3] -``` - -[⬆ back to top](#table-of-contents) - -### zip - -Creates an array of elements, grouped based on the position in the original arrays. - -Use `Math.max.apply()` to get the longest array in the arguments. -Creates an array with that length as return value and use `Array.from()` with a map-function to create an array of grouped elements. -If lengths of the argument-arrays vary, `undefined` is used where no value could be found. - -```js -const zip = (...arrays) => { - const maxLength = Math.max(...arrays.map(x => x.length)); - return Array.from({length: maxLength}).map((_, i) => { - return Array.from({length: arrays.length}, (_, k) => arrays[k][i]); - }) -} -``` - -```js -zip(['a', 'b'], [1, 2], [true, false]); -> [['a', 1, true], ['b', 2, false]] -zip(['a'], [1, 2], [true, false]); -> [['a', 1, true], [undefined, 2, false]] -``` - -[⬆ back to top](#table-of-contents) - -### zipObject - -Given an array of valid property identifiers and an array of values, return an object associating the properties to the values. - -Since an object can have undefined values but not undefined property pointers, the array of properties is used to decide the structure of the resulting object using `Array.reduce()`. - -```js -const zipObject = ( props, values ) => props.reduce( ( obj, prop, index ) => ( obj[prop] = values[index], obj ), {} ) -``` - -```js -zipObject(['a','b','c'], [1,2]) -> {a: 1, b: 2, c: undefined} -zipObject(['a','b'], [1,2,3]) -> {a: 1, b: 2} -``` - -[⬆ back to top](#table-of-contents) -## Browser - -### arrayToHtmlList - -Converts the given array elements into `
  • ` tags and appends them to the list of the given id. - -Use `Array.map()` and `document.querySelector()` to create a list of html tags. - -```js -const arrayToHtmlList = (arr, listID) => arr.map(item => document.querySelector("#"+listID).innerHTML+=`
  • ${item}
  • `); -``` - -```js -arrayToHtmlList(['item 1', 'item 2'],'myListID') -``` - -[⬆ back to top](#table-of-contents) - -### bottomVisible - -Returns `true` if the bottom of the page is visible, `false` otherwise. - -Use `scrollY`, `scrollHeight` and `clientHeight` to determine if the bottom of the page is visible. - -```js -const bottomVisible = () => - document.documentElement.clientHeight + window.scrollY >= (document.documentElement.scrollHeight || document.documentElement.clientHeight); -``` - -```js -// bottomVisible() -> true -``` - -[⬆ back to top](#table-of-contents) - -### currentURL - -Returns the current URL. - -Use `window.location.href` to get current URL. - -```js -const currentURL = () => window.location.href; -``` - -```js -currentUrl() -> 'https://google.com' -``` - -[⬆ back to top](#table-of-contents) - -### detectDeviceType - -Detects wether the website is being opened in a mobile device or a desktop/laptop. - -Use a regular expression to test the `navigator.userAgent` property to figure out if the device is a mobile device or a desktop/laptop. - -```js -const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? "Mobile" : "Desktop"; -``` - -```js -detectDeviceType() -> "Mobile" -detectDeviceType() -> "Desktop" -``` - -[⬆ back to top](#table-of-contents) - -### elementIsVisibleInViewport - -Returns `true` if the element specified is visible in the viewport, `false` otherwise. - -Use `Element.getBoundingClientRect()` and the `window.inner(Width|Height)` values -to determine if a given element is visible in the viewport. -Omit the second argument to determine if the element is entirely visible, or specify `true` to determine if -it is partially visible. - -```js -const elementIsVisibleInViewport = (el, partiallyVisible = false) => { - const { top, left, bottom, right } = el.getBoundingClientRect(); - const { innerHeight, innerWidth } = window; - return partiallyVisible - ? ((top > 0 && top < innerHeight) || (bottom > 0 && bottom < innerHeight)) && - ((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth)) - : top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth; -}; -``` - -```js -// e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10} -elementIsVisibleInViewport(el) -> false // (not fully visible) -elementIsVisibleInViewport(el, true) -> true // (partially visible) -``` - -[⬆ back to top](#table-of-contents) - -### getScrollPosition - -Returns the scroll position of the current page. - -Use `pageXOffset` and `pageYOffset` if they are defined, otherwise `scrollLeft` and `scrollTop`. -You can omit `el` to use a default value of `window`. - -```js -const getScrollPosition = (el = window) => - ({x: (el.pageXOffset !== undefined) ? el.pageXOffset : el.scrollLeft, - y: (el.pageYOffset !== undefined) ? el.pageYOffset : el.scrollTop}); -``` - -```js -getScrollPosition() -> {x: 0, y: 200} -``` - -[⬆ back to top](#table-of-contents) - -### getURLParameters - -Returns an object containing the parameters of the current URL. - -Use `match()` with an appropriate regular expression to get all key-value pairs, `Array.reduce()` to map and combine them into a single object. -Pass `location.search` as the argument to apply to the current `url`. - -```js -const getURLParameters = url => - url.match(/([^?=&]+)(=([^&]*))/g).reduce( - (a, v) => (a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1), a), {} - ); -``` - -```js -getURLParameters('http://url.com/page?name=Adam&surname=Smith') -> {name: 'Adam', surname: 'Smith'} -``` - -[⬆ back to top](#table-of-contents) - -### httpsRedirect - -Redirects the page to HTTPS if its currently in HTTP. Also, pressing the back button doesn't take it back to the HTTP page as its replaced in the history. - -Use `location.protocol` to get the protocol currently being used. If it's not HTTPS, use `location.replace()` to replace the existing page with the HTTPS version of the page. Use `location.href` to get the full address, split it with `String.split()` and remove the protocol part of the URL. - -```js -const httpsRedirect = () => { - if (location.protocol !== 'https:') location.replace('https://' + location.href.split('//')[1]); -}; -``` - -[⬆ back to top](#table-of-contents) - -### redirect - -Redirects to a specified URL. - -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`). - -```js -const redirect = (url, asLink = true) => - asLink ? window.location.href = url : window.location.replace(url); -``` - -```js -redirect('https://google.com') -``` - -[⬆ back to top](#table-of-contents) - -### scrollToTop - -Smooth-scrolls to the top of the page. - -Get distance from top using `document.documentElement.scrollTop` or `document.body.scrollTop`. -Scroll by a fraction of the distance from the top. Use `window.requestAnimationFrame()` to animate the scrolling. - -```js -const scrollToTop = () => { - const c = document.documentElement.scrollTop || document.body.scrollTop; - if (c > 0) { - window.requestAnimationFrame(scrollToTop); - window.scrollTo(0, c - c / 8); - } -}; -``` - -```js -scrollToTop() -``` - -[⬆ back to top](#table-of-contents) -## Date - -### getDaysDiffBetweenDates - -Returns the difference (in days) between two dates. - -Calculate the difference (in days) between two `Date` objects. - -```js -const getDaysDiffBetweenDates = (dateInitial, dateFinal) => (dateFinal - dateInitial) / (1000 * 3600 * 24); -``` - -```js -getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) -> 9 -``` - -[⬆ back to top](#table-of-contents) - -### JSONToDate - -Converts a JSON object to a date. - -Use `Date()`, to convert dates in JSON format to readable format (`dd/mm/yyyy`). - -```js -const JSONToDate = arr => { - const dt = new Date(parseInt(arr.toString().substr(6))); - return `${dt.getDate()}/${dt.getMonth() + 1}/${dt.getFullYear()}`; -}; -``` - -```js -JSONToDate(/Date(1489525200000)/) -> "14/3/2017" -``` - -[⬆ back to top](#table-of-contents) - -### toEnglishDate - -Converts a date from American format to English format. - -Use `Date.toISOString()`, `split('T')` and `replace()` to convert a date from American format to the English format. -Throws an error if the passed time cannot be converted to a date. - -```js -const toEnglishDate = (time) => - {try{return new Date(time).toISOString().split('T')[0].replace(/-/g, '/')}catch(e){return}}; -``` - -```js -toEnglishDate('09/21/2010') -> '21/09/2010' -``` - -[⬆ back to top](#table-of-contents) - -### tomorrow - -Results in a string representation of tomorrow's date. -Use `new Date()` to get today's date, adding `86400000` of seconds to it(24 hours), using `toISOString` to convert Date object to string. - -```js -const tomorrow = () => new Date(new Date().getTime() + 86400000).toISOString().split('T')[0]; -// tomorrow() -> 2017-12-27 (if current date is 2017-12-26) -``` - -[⬆ back to top](#table-of-contents) -## Function - -### chainAsync - -Chains asynchronous functions. - -Loop through an array of functions containing asynchronous events, calling `next` when each asynchronous event has completed. - -```js -const chainAsync = fns => { let curr = 0; const next = () => fns[curr++](next); next(); }; -``` - -```js -chainAsync([ - next => { console.log('0 seconds'); setTimeout(next, 1000); }, - next => { console.log('1 second'); setTimeout(next, 1000); }, - next => { console.log('2 seconds'); } -]) -``` - -[⬆ back to top](#table-of-contents) - -### compose - -Performs right-to-left function composition. - -Use `Array.reduce()` to perform right-to-left function composition. -The last (rightmost) function can accept one or more arguments; the remaining functions must be unary. - -```js -const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args))); -``` - -```js -const add5 = x => x + 5 -const multiply = (x, y) => x * y -const multiplyAndAdd5 = compose(add5, multiply) -multiplyAndAdd5(5, 2) -> 15 -``` - -[⬆ back to top](#table-of-contents) - -### curry - -Curries a function. - -Use recursion. -If the number of provided arguments (`args`) is sufficient, call the passed function `fn`. -Otherwise, return a curried function `fn` that expects the rest of the arguments. -If you want to curry a function that accepts a variable number of arguments (a variadic function, e.g. `Math.min()`), you can optionally pass the number of arguments to the second parameter `arity`. - -```js -const curry = (fn, arity = fn.length, ...args) => - arity <= args.length - ? fn(...args) - : curry.bind(null, fn, arity, ...args); -``` - -```js -curry(Math.pow)(2)(10) -> 1024 -curry(Math.min, 3)(10)(50)(2) -> 2 -``` - -[⬆ back to top](#table-of-contents) - -### functionName - -Logs the name of a function. - -Use `console.debug()` and the `name` property of the passed method to log the method's name to the `debug` channel of the console. - -```js -const functionName = fn => (console.debug(fn.name), fn); -``` - -```js -functionName(Math.max) -> max (logged in debug channel of console) -``` - -[⬆ back to top](#table-of-contents) - -### pipe - -Performs left-to-right function composition. - -Use `Array.reduce()` with the spread operator (`...`) to perform left-to-right function composition. -The first (leftmost) function can accept one or more arguments; the remaining functions must be unary. - -```js -const pipeFunctions = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args))); -``` - -```js -const add5 = x => x + 5 -const multiply = (x, y) => x * y -const multiplyAndAdd5 = pipeFunctions(multiply, add5) -multiplyAndAdd5(5, 2) -> 15 -``` - -[⬆ back to top](#table-of-contents) - -### runPromisesInSeries - -Runs an array of promises in series. - -Use `Array.reduce()` to create a promise chain, where each promise returns the next promise when resolved. - -```js -const runPromisesInSeries = ps => ps.reduce((p, next) => p.then(next), Promise.resolve()); -``` - -```js -const delay = (d) => new Promise(r => setTimeout(r, d)) -runPromisesInSeries([() => delay(1000), () => delay(2000)]) -> //executes each promise sequentially, taking a total of 3 seconds to complete -``` - -[⬆ back to top](#table-of-contents) - -### sleep - -Delays the execution of an asynchronous function. - -Delay executing part of an `async` function, by putting it to sleep, returning a `Promise`. - -```js -const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); -``` - -```js -async function sleepyWork() { - console.log('I\'m going to sleep for 1 second.'); - await sleep(1000); - console.log('I woke up after 1 second.'); -} -``` - -[⬆ back to top](#table-of-contents) -## Logic - -### negate - -Negates a predicate function. - -Take a predicate function and apply `not` to it with its arguments. - -```js -const negate = func => (...args) => !func(...args); -``` - -```js -filter([1, 2, 3, 4, 5, 6], negate(isEven)) -> [1, 3, 5] -negate(isOdd)(1) -> false -``` - -[⬆ back to top](#table-of-contents) -## Math - -### arrayAverage - -Returns the average of an array of numbers. - -Use `Array.reduce()` to add each value to an accumulator, initialized with a value of `0`, divide by the `length` of the array. - -```js -const arrayAverage = arr => arr.reduce((acc, val) => acc + val, 0) / arr.length; -``` - -```js -arrayAverage([1,2,3]) -> 2 -``` - -[⬆ back to top](#table-of-contents) - -### arraySum - -Returns the sum of an array of numbers. - -Use `Array.reduce()` to add each value to an accumulator, initialized with a value of `0`. - -```js -const arraySum = arr => arr.reduce((acc, val) => acc + val, 0); -``` - -```js -arraySum([1,2,3,4]) -> 10 -``` - -[⬆ back to top](#table-of-contents) - -### clampNumber - -Clamps `num` within the inclusive range specified by the boundary values `a` and `b` - -If `lower` is greater than `upper`, swap them. -If `num` falls within the range, return `num`. -Otherwise, return the nearest number in the range. - -```js -const clampNumber = (num, lower, upper) => { - if(lower > upper) upper = [lower, lower = upper][0]; - return (num>=lower && num<=upper) ? num : ((num < lower) ? lower : upper) -} -``` - -```js -clampNumber(2, 3, 5) -> 3 -clampNumber(1, -1, -5) -> -1 -clampNumber(3, 2, 4) -> 3 -``` - -[⬆ back to top](#table-of-contents) - -### collatz - -Applies the Collatz algorithm. - -If `n` is even, return `n/2`. Otherwise, return `3n+1`. - -```js -const collatz = n => (n % 2 == 0) ? (n / 2) : (3 * n + 1); -``` - -```js -collatz(8) -> 4 -collatz(5) -> 16 -``` - -[⬆ back to top](#table-of-contents) - -### digitize - -Converts a number to an array of digits. - -Convert the number to a string, using spread operators in ES6(`[...string]`) build an array. -Use `Array.map()` and `parseInt()` to transform each value to an integer. - -```js -const digitize = n => [...''+n].map(i => parseInt(i)); -``` - -```js -differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) -> [1, 1.2] -``` - -[⬆ back to top](#table-of-contents) - -### distance - -Returns the distance between two points. - -Use `Math.hypot()` to calculate the Euclidean distance between two points. - -```js -const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0); -``` - -```js -distance(1,1, 2,3) -> 2.23606797749979 -``` - -[⬆ back to top](#table-of-contents) - -### factorial - -Calculates the factorial of a number. - -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`. -Throws an exception if `n` is a negative number. - -```js -const factorial = n => - n < 0 ? (() => { throw new TypeError('Negative numbers are not allowed!'); })() - : n <= 1 ? 1 : n * factorial(n - 1); -``` - -```js -factorial(6) -> 720 -``` - -[⬆ back to top](#table-of-contents) - -### fibonacci - -Generates an array, containing the Fibonacci sequence, up until the nth term. - -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. - -```js -const fibonacci = n => - Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []); -``` - -```js -factorial(6) -> 720 -``` - -[⬆ back to top](#table-of-contents) - -### fibonacciCountUntilNum - -Returns the number of fibonnacci numbers up to `num`(`0` and `num` inclusive). - -Use a mathematical formula to calculate the number of fibonacci numbers until `num`. - -```js -const fibonacciCountUntilNum = num => - Math.ceil(Math.log(num * Math.sqrt(5) + 1/2) / Math.log((Math.sqrt(5)+1)/2)); -``` - -```js -fibonacciCountUntilNum(10) -> 7 -``` - -[⬆ back to top](#table-of-contents) - -### fibonacciUntilNum - -Generates an array, containing the Fibonacci sequence, up until the nth term. - -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. -Uses a mathematical formula to calculate the length of the array required. - -```js -const fibonacciUntilNum = num => { - let n = Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2)); - return Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []); -} -``` - -```js -fibonacciCountUntilNum(10) -> 7 -``` - -[⬆ back to top](#table-of-contents) - -### gcd - -Calculates the greatest common divisor between two numbers. - -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`. - -```js -const gcd = (x, y) => !y ? x : gcd(y, x % y); -``` - -```js -gcd (8, 36) -> 4 -``` - -[⬆ back to top](#table-of-contents) - -### hammingDistance - -Calculates the Hamming distance between two values. - -Use XOR operator (`^`) to find the bit difference between the two numbers, convert to a binary string using `toString(2)`. -Count and return the number of `1`s in the string, using `match(/1/g)`. - -```js -const hammingDistance = (num1, num2) => - ((num1 ^ num2).toString(2).match(/1/g) || '').length; -``` - -```js -hammingDistance(2,3) -> 1 -``` - -[⬆ back to top](#table-of-contents) - -### inRange - -Checks if the given number falls within the given range. - -Use arithmetic comparison to check if the given number is in the specified range. -If the second parameter, `end`, is not specified, the range is considered to be from `0` to `start`. - -```js -const inRange = (n, start, end=null) => { - if(end && start > end) end = [start, start=end][0]; - return (end == null) ? (n>=0 && n=start && n true -inRange(3, 4) -> true -inRange(2, 3, 5) -> false -inrange(3, 2) -> false -``` - -[⬆ back to top](#table-of-contents) - -### isArmstrongNumber - -Checks if the given number is an Armstrong number or not. - -Convert the given number into an array of digits. Use `Math.pow()` to get the appropriate power for each digit and sum them up. If the sum is equal to the number itself, return `true` otherwise `false`. - -```js -const isArmstrongNumber = digits => - ( arr => arr.reduce( ( a, d ) => a + Math.pow( parseInt( d ), arr.length ), 0 ) == digits ? true : false )( ( digits+'' ).split( '' ) ); -``` - -```js -isArmstrongNumber(1634) -> true -isArmstrongNumber(371) -> true -isArmstrongNumber(56) -> false -``` - -[⬆ back to top](#table-of-contents) - -### isDivisible - -Checks if the first numeric argument is divisible by the second one. - -Use the modulo operator (`%`) to check if the remainder is equal to `0`. - -```js -const isDivisible = (dividend, divisor) => dividend % divisor === 0; -``` - -```js -isDivisible(6,3) -> true -``` - -[⬆ back to top](#table-of-contents) - -### isEven - -Returns `true` if the given number is even, `false` otherwise. - -Checks whether a number is odd or even using the modulo (`%`) operator. -Returns `true` if the number is even, `false` if the number is odd. - -```js -const isEven = num => num % 2 === 0; -``` - -```js -isEven(3) -> false -``` - -[⬆ back to top](#table-of-contents) - -### isPrime - -Checks if the provided integer is a prime number. - -Check numbers from `2` to the square root of the given number. -Return `false` if any of them divides the given number, else return `true`, unless the number is less than `2`. - -```js -const isPrime = num => { - const boundary = Math.floor(Math.sqrt(num)); - for (var i = 2; i * i <= boundary; i++) if (num % i == 0) return false; - return num >= 2; -}; -``` - -```js -isPrime(11) -> true -isPrime(12) -> false -``` - -[⬆ back to top](#table-of-contents) - -### lcm - -Returns the least common multiple of two numbers. - -Use the greatest common divisor (GCD) formula and `Math.abs()` to determine the least common multiple. -The GCD formula uses recursion. - -```js -const lcm = (x, y) => { - const gcd = (x, y) => !y ? x : gcd(y, x % y); - return Math.abs(x * y) / (gcd(x, y)); -}; -``` - -```js -lcm(12,7) -> 84 -``` - -[⬆ back to top](#table-of-contents) - -### median - -Returns the median of an array of numbers. - -Find the middle of the array, use `Array.sort()` to sort the values. -Return the number at the midpoint if `length` is odd, otherwise the average of the two middle numbers. - -```js -const median = arr => { - const mid = Math.floor(arr.length / 2), nums = [...arr].sort((a, b) => a - b); - return arr.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2; -}; -``` - -```js -median([5,6,50,1,-5]) -> 5 -median([0,10,-2,7]) -> 3.5 -``` - -[⬆ back to top](#table-of-contents) - -### palindrome - -Returns `true` if the given string is a palindrome, `false` otherwise. - -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()`. - -```js -const palindrome = str => { - const s = str.toLowerCase().replace(/[\W_]/g,''); - return s === s.split('').reverse().join(''); -} -``` - -```js -palindrome('taco cat') -> true -``` - -[⬆ back to top](#table-of-contents) - -### percentile - -Uses the percentile formula to calculate how many numbers in the given array are less or equal to the given value. - -Use `Array.reduce()` to calculate how many numbers are below the value and how many are the same value and apply the percentile formula. - -```js -const percentile = (arr, val) => - 100 * arr.reduce((acc,v) => acc + (v < val ? 1 : 0) + (v === val ? 0.5 : 0), 0) / arr.length; -``` - -```js -percentile([1,2,3,4,5,6,7,8,9,10], 6) -> 55 -``` - -[⬆ back to top](#table-of-contents) - -### powerset - -Returns the powerset of a given array of numbers. - -Use `Array.reduce()` combined with `Array.map()` to iterate over elements and combine into an array containing all combinations. - -```js -const powerset = arr => - arr.reduce((a, v) => a.concat(a.map(r => [v].concat(r))), [[]]); -``` - -```js -powerset([1,2]) -> [[], [1], [2], [2,1]] -``` - -[⬆ back to top](#table-of-contents) - -### primes - -Generates primes up to a given number, using the Sieve of Eratosthenes. - -Generate an array from `2` to the given number. Use `Array.filter()` to filter out the values divisible by any number from `2` to the square root of the provided number. - -```js -const primes = num => { - let arr = Array.from({length:num-1}).map((x,i)=> i+2), - sqroot = Math.floor(Math.sqrt(num)), - numsTillSqroot = Array.from({length:sqroot-1}).map((x,i)=> i+2); - numsTillSqroot.forEach(x => arr = arr.filter(y => ((y%x)!==0)||(y==x))); - return arr; -} -``` - -```js -primes(10) -> [2,3,5,7] -``` - -[⬆ back to top](#table-of-contents) - -### randomIntegerInRange - -Returns a random integer in the specified range. - -Use `Math.random()` to generate a random number and map it to the desired range, using `Math.floor()` to make it an integer. - -```js -const randomIntegerInRange = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; -``` - -```js -randomIntegerInRange(0, 5) -> 2 -``` - -[⬆ back to top](#table-of-contents) - -### randomNumberInRange - -Returns a random number in the specified range. - -Use `Math.random()` to generate a random value, map it to the desired range using multiplication. - -```js -const randomNumberInRange = (min, max) => Math.random() * (max - min) + min; -``` - -```js -randomNumberInRange(2,10) -> 6.0211363285087005 -``` - -[⬆ back to top](#table-of-contents) - -### round - -Rounds a number to a specified amount of digits. - -Use `Math.round()` and template literals to round the number to the specified number of digits. -Omit the second argument, `decimals` to round to an integer. - -```js -const round = (n, decimals=0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`); -``` - -```js -round(1.005, 2) -> 1.01 -``` - -[⬆ back to top](#table-of-contents) - -### sdbmHashAlgorithm - -This algorithm is a simple hash-algorithm that hashes it input string `s` into a whole number. - -Use `split('')` and `Array.reduce()` to create a hash of the input string, utilizing bit shifting. - -``` js -const sdbm = str => { - let arr = str.split(''); - return arr.reduce((hashCode, currentVal) => - hashCode = currentVal.charCodeAt(0) + (hashCode << 6) + (hashCode << 16) - hashCode - ,0) -} -// console.log(sdbm("name")) // -3521204949 -// console.log(sdbm("age")) // 808122783 -``` - -[⬆ back to top](#table-of-contents) - -### standardDeviation - -Returns the standard deviation of an array of numbers. - -Use `Array.reduce()` to calculate the mean, variance and the sum of the variance of the values, the variance of the values, then -determine the standard deviation. -You can omit the second argument to get the sample standard deviation or set it to `true` to get the population standard deviation. - -```js -const standardDeviation = (arr, usePopulation = false) => { - const mean = arr.reduce((acc, val) => acc + val, 0) / arr.length; - return Math.sqrt( - arr.reduce((acc, val) => acc.concat(Math.pow(val - mean, 2)), []) - .reduce((acc, val) => acc + val, 0) / (arr.length - (usePopulation ? 0 : 1)) - ); -}; -``` - -```js -standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample) -standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population) -``` - -[⬆ back to top](#table-of-contents) -## Media - -### speechSynthesis - -Performs speech synthesis (experimental). - -Use `SpeechSynthesisUtterance.voice` and `window.speechSynthesis.getVoices()` to convert a message to speech. -Use `window.speechSynthesis.speak()` to play the message. - -Learn more about the [SpeechSynthesisUtterance interface of the Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesisUtterance). - -```js -const speechSynthesis = message => { - const msg = new SpeechSynthesisUtterance(message); - msg.voice = window.speechSynthesis.getVoices()[0]; - window.speechSynthesis.speak(msg); -}; -``` - -```js -speechSynthesis('Hello, World') -> // plays the message -``` - -[⬆ back to top](#table-of-contents) -## Node - -### JSONToFile - -Writes a JSON object to a file. - -Use `fs.writeFile()`, template literals and `JSON.stringify()` to write a `json` object to a `.json` file. - -```js -const fs = require('fs'); -const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2)) -``` - -```js -JSONToFile({test: "is passed"}, 'testJsonFile') -> writes the object to 'testJsonFile.json' -``` - -[⬆ back to top](#table-of-contents) - -### readFileLines - -Returns an array of lines from the specified file. - -Use `readFileSync` function in `fs` node package to create a `Buffer` from a file. -convert buffer to string using `toString(encoding)` function. -creating an array from contents of file by `split`ing file content line by line (each `\n`). - -```js -const fs = require('fs'); -const readFileLines = filename => fs.readFileSync(filename).toString('UTF8').split('\n'); -``` - -```js -contents of test.txt : - line1 - line2 - line3 - ___________________________ -let arr = readFileLines('test.txt') -console.log(arr) // -> ['line1', 'line2', 'line3'] -``` - -[⬆ back to top](#table-of-contents) -## Object - -### cleanObj - -Removes any properties except the ones specified from a JSON object. - -Use `Object.keys()` method to loop over given JSON object and deleting keys that are not `include`d in given array. -Also if you give it a special key (`childIndicator`) it will search deeply inside it to apply function to inner objects too. - -```js -const cleanObj = (obj, keysToKeep = [], childIndicator) => { - Object.keys(obj).forEach(key => { - if (key === childIndicator) { - cleanObj(obj[key], keysToKeep, childIndicator); - } else if (!keysToKeep.includes(key)) { - delete obj[key]; - } - }) -} -``` - -```js -const testObj = {a: 1, b: 2, children: {a: 1, b: 2}} -cleanObj(testObj, ["a"],"children") -console.log(testObj) // { a: 1, children : { a: 1}} -``` - -[⬆ back to top](#table-of-contents) - -### objectFromPairs - -Creates an object from the given key-value pairs. - -Use `Array.reduce()` to create and combine key-value pairs. - -```js -const objectFromPairs = arr => arr.reduce((a, v) => (a[v[0]] = v[1], a), {}); -``` - -```js -objectFromPairs([['a',1],['b',2]]) -> {a: 1, b: 2} -``` - -[⬆ back to top](#table-of-contents) - -### objectToPairs - -Creates an array of key-value pair arrays from an object. - -Use `Object.keys()` and `Array.map()` to iterate over the object's keys and produce an array with key-value pairs. - -```js -const objectToPairs = obj => Object.keys(obj).map(k => [k, obj[k]]); -``` - -```js -objectToPairs({a: 1, b: 2}) -> [['a',1],['b',2]]) -``` - -[⬆ back to top](#table-of-contents) - -### orderBy - -Returns a sorted array of objects ordered by properties and orders. - -Uses a custom implementation of sort, that reduces the props array argument with a default value of 0, it uses destructuring to swap the properties position depending on the order passed. -If no orders array is passed it sort by 'asc' by default. - -```js -const orderBy = (arr, props, orders) => - arr.sort((a, b) => - props.reduce((acc, prop, i) => { - if (acc === 0) { - const [p1, p2] = orders && orders[i] === 'desc' ? [b[prop], a[prop]] : [a[prop], b[prop]]; - acc = p1 > p2 ? 1 : p1 < p2 ? -1 : 0; - } - return acc; - }, 0) - ); -``` - -```js -const users = [{ 'name': 'fred', 'age': 48 },{ 'name': 'barney', 'age': 36 }, - { 'name': 'fred', 'age': 40 },{ 'name': 'barney', 'age': 34 }]; -orderby(users, ['name', 'age'], ['asc', 'desc']) -> [{name: 'barney', age: 36}, {name: 'barney', age: 34}, {name: 'fred', age: 48}, {name: 'fred', age: 40}] -orderby(users, ['name', 'age']) -> [{name: 'barney', age: 34}, {name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}] -``` - -[⬆ back to top](#table-of-contents) - -### select - -Retrieve a property that indicated by the selector from an object. - -If the property does not exists returns `undefined`. - -```js -const select = (from, selector) => - selector.split('.').reduce((prev, cur) => prev && prev[cur], from); -``` - -```js -const obj = {selector: {to: {val: 'val to select'}}}; -select(obj, 'selector.to.val'); -> 'val to select' -``` - -[⬆ back to top](#table-of-contents) - -### shallowClone - -Creates a shallow clone of an object. - -Use `Object.assign()` and an empty object (`{}`) to create a shallow clone of the original. - -```js -const shallowClone = obj => Object.assign({}, obj); -``` - -```js -const a = { x: true, y: 1 }; -const b = shallowClone(a); -a === b -> false -``` - -[⬆ back to top](#table-of-contents) - -### truthCheckCollection - -Checks if the predicate (second argument) is truthy on all elements of a collection (first argument). - -Use `Array.every()` to check if each passed object has the specified property and if it returns a truthy value. - - ```js -const truthCheckCollection = (collection, pre) => (collection.every(obj => obj[pre])); -``` - -```js -truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") -> true -``` - -[⬆ back to top](#table-of-contents) -## String - -### anagrams - -Generates all anagrams of a string (contains duplicates). - -Use recursion. -For each letter in the given string, create all the partial anagrams for the rest of its letters. -Use `Array.map()` to combine the letter with each partial anagram, then `Array.reduce()` to combine all anagrams in one array. -Base cases are for string `length` equal to `2` or `1`. - -```js -const anagrams = str => { - if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str]; - return str.split('').reduce((acc, letter, i) => - acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)), []); -}; -``` - -```js -anagrams('abc') -> ['abc','acb','bac','bca','cab','cba'] -``` - -[⬆ back to top](#table-of-contents) - -### Capitalize - -Capitalizes the first letter of a string. - -Use destructuring and `toUpperCase()` to capitalize first letter, `...rest` to get array of characters after first letter and then `Array.join('')` to make it a string again. -Omit the `lowerRest` parameter to keep the rest of the string intact, or set it to `true` to convert to lowercase. - -```js -const capitalize = ([first, ...rest], lowerRest = false) => - first.toUpperCase() + (lowerRest ? rest.join('').toLowerCase() : rest.join('')); -``` - -```js -capitalize('fooBar') -> 'FooBar' -capitalize('fooBar', true) -> 'Foobar' -``` - -[⬆ back to top](#table-of-contents) - -### capitalizeEveryWord - -Capitalizes the first letter of every word in a string. - -Use `replace()` to match the first character of each word and `toUpperCase()` to capitalize it. - -```js -const capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase()); -``` - -```js -capitalizeEveryWord('hello world!') -> 'Hello World!' -``` - -[⬆ back to top](#table-of-contents) - -### countVowels - -Retuns `number` of vowels in provided string. - -Use a regular expression to count the number of vowels `(A, E, I, O, U)` in a `string`. - -```js -const countVowels = str => (str.match(/[aeiou]/ig) || []).length; -``` - -```js -countVowels('foobar') -> 3 -countVowels('gym') -> 0 -``` - -[⬆ back to top](#table-of-contents) - -### escapeRegExp - -Escapes a string to use in a regular expression. - -Use `replace()` to escape special characters. - -```js -const escapeRegExp = str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); -``` - -```js -escapeRegExp('(test)') -> \\(test\\) -``` - -[⬆ back to top](#table-of-contents) - -### fromCamelCase - -Converts a string from camelcase. - -Use `replace()` to remove underscores, hyphens, and spaces and convert words to camelcase. -Omit the second argument to use a default separator of `_`. - -```js -const fromCamelCase = (str, separator = '_') => - str.replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2') - .replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + separator + '$2').toLowerCase(); -``` - -```js -fromCamelCase('someDatabaseFieldName', ' ') -> 'some database field name' -fromCamelCase('someLabelThatNeedsToBeCamelized', '-') -> 'some-label-that-needs-to-be-camelized' -fromCamelCase('someJavascriptProperty', '_') -> 'some_javascript_property' -``` - -[⬆ back to top](#table-of-contents) - -### repeatString - -Repeats a string n times using `String.repeat()` - -If no string is provided the default is `""` and the default number of times is 2. - -```js -const repeatString = (str="",num=2) => { - return num >= 0 ? str.repeat(num) : str; -} -``` - -```js -repeatString("abc",3) -> 'abcabcabc' -repeatString("abc") -> 'abcabc' -``` - -[⬆ back to top](#table-of-contents) - -### reverseString - -Reverses a string. - -Use `split('')` and `Array.reverse()` to reverse the order of the characters in the string. -Combine characters to get a string using `join('')`. - -```js -const reverseString = str => str.split('').reverse().join(''); -``` - -```js -reverseString('foobar') -> 'raboof' -``` - -[⬆ back to top](#table-of-contents) - -### sortCharactersInString - -Alphabetically sorts the characters in a string. - -Split the string using `split('')`, `Array.sort()` utilizing `localeCompare()`, recombine using `join('')`. - -```js -const sortCharactersInString = str => - str.split('').sort((a, b) => a.localeCompare(b)).join(''); -``` - -```js -sortCharactersInString('cabbage') -> 'aabbceg' -``` - -[⬆ back to top](#table-of-contents) - -### toCamelCase - -Converts a string to camelcase. - -Break the string into words and combine them capitalizing the first letter of each word. -For more detailed explanation of this Regex, [visit this Site](https://regex101.com/r/bMCgAB/1). - -```js -const toCamelCase = str => { - let s = str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) - .map(x => x.slice(0, 1).toUpperCase() + x.slice(1).toLowerCase()) - .join(''); - return s.slice(0,1).toLowerCase() + s.slice(1) - } -``` - -```js -toCamelCase("some_database_field_name") -> 'someDatabaseFieldName' -toCamelCase("Some label that needs to be camelized") -> 'someLabelThatNeedsToBeCamelized' -toCamelCase("some-javascript-property") -> 'someJavascriptProperty' -toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") -> 'someMixedStringWithSpacesUnderscoresAndHyphens' -``` - -[⬆ back to top](#table-of-contents) - -### toKebabCase - -Converts a string to kebab case. - -Break the string into words and combine them using `-` as a separator. -For more detailed explanation of this Regex, [visit this Site](https://regex101.com/r/bMCgAB/1). - -```js -const toKebabCase = str => - str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) - .map(x => x.toLowerCase()) - .join('-'); -``` - -```js -toKebabCase("camelCase") -> 'camel-case' -toKebabCase("some text") -> 'some-text' -toKebabCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some-mixed-string-with-spaces-underscores-and-hyphens' -toKebabCase("AllThe-small Things") -> "all-the-small-things" -toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-xml-and-html" -``` - -[⬆ back to top](#table-of-contents) - -### toSnakeCase - -Converts a string to snake case. - -Break the string into words and combine them using `_` as a separator. -For more detailed explanation of this Regex, [visit this Site](https://regex101.com/r/bMCgAB/1). - -```js -const toSnakeCase = str => { - str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) - .map(x => x.toLowerCase()) - .join('_'); -``` - -```js -toSnakeCase("camelCase") -> 'camel_case' -toSnakeCase("some text") -> 'some_text' -toSnakeCase("some-javascript-property") -> 'some_javascript_property' -toSnakeCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some_mixed_string_with_spaces_underscores_and_hyphens' -toSnakeCase("AllThe-small Things") -> "all_the_smal_things" -toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html" -``` - -[⬆ back to top](#table-of-contents) - -### truncateString - -Truncates a string up to a specified length. - -Determine if the string's `length` is greater than `num`. -Return the string truncated to the desired length, with `...` appended to the end or the original string. - -```js -const truncateString = (str, num) => - str.length > num ? str.slice(0, num > 3 ? num - 3 : num) + '...' : str; -``` - -```js -truncateString('boomerang', 7) -> 'boom...' -``` - -[⬆ back to top](#table-of-contents) - -### words - -Converts a given string into an array of words. - -Use `String.split()` with a supplied pattern (defaults to non-alpha as a regex) to convert to an array of strings. Use `Array.filter()` to remove any empty strings. -Omit the second argument to use the default regex. - -```js -const words = (str, pattern = /[^a-zA-Z-]+/) => str.split(pattern).filter(Boolean); -``` - -```js -words("I love javaScript!!") -> ["I", "love", "javaScript"] -words("python, javaScript & coffee") -> ["python", "javaScript", "coffee"] -``` - -[⬆ back to top](#table-of-contents) -## Utility - -### coalesce - -Returns the first non-null/undefined argument. - -Use `Array.find()` to return the first non `null`/`undefined` argument. - -```js -const coalesce = (...args) => args.find(_ => ![undefined, null].includes(_)) -``` - -```js -coalesce(null,undefined,"",NaN, "Waldo") -> "" -``` - -[⬆ back to top](#table-of-contents) - -### coalesceFactory - -Returns a customized coalesce function that returns the first argument that returns `true` from the provided argument validation function. - -Use `Array.find()` to return the first argument that returns `true` from the provided argument validation function. - -```js -const coalesceFactory = valid => (...args) => args.find(valid); -``` - -```js -const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_)) -customCoalesce(undefined, null, NaN, "", "Waldo") // "Waldo" -``` - -[⬆ back to top](#table-of-contents) - -### extendHex - -Extends a 3-digit color code to a 6-digit color code. - -Use `Array.map()`, `split()` and `Array.join()` to join the mapped array for converting a 3-digit RGB notated hexadecimal color-code to the 6-digit form. -`String.slice()` is used to remove `#` from string start since it's added once. -```js -const extendHex = shortHex => - '#' + shortHex.slice(shortHex.startsWith('#') ? 1 : 0).split('').map(x => x+x).join('') -``` - -```js -extendHex('#03f') -> '#0033ff' -extendHex('05a') -> '#0055aa' -``` - -[⬆ back to top](#table-of-contents) - -### getType - -Returns the native type of a value. - -Returns lowercased constructor name of value, "undefined" or "null" if value is undefined or null - -```js -const getType = v => - v === undefined ? 'undefined' : v === null ? 'null' : v.constructor.name.toLowerCase(); -``` - -```js -getType(new Set([1,2,3])) -> "set" -``` - -[⬆ back to top](#table-of-contents) - -### hexToRGB - -Converts a color code to a `rgb()` or `rgba()` string if alpha value is provided. - -Use bitwise right-shift operator and mask bits with `&` (and) operator to convert a hexadecimal color code (with or without prefixed with `#`) to a string with the RGB values. If it's 3-digit color code, first convert to 6-digit version. If an alpha value is provided alongside 6-digit hex, give `rgba()` string in return. - -```js -const hexToRGB = hex => { - let alpha = false, h = hex.slice(hex.startsWith('#') ? 1 : 0); - if (h.length === 3) h = [...h].map(x => x + x).join(''); - else if (h.length === 8) alpha = true; - h = parseInt(h, 16); - return 'rgb' + (alpha ? 'a' : '') + '(' + - (h >>> (alpha ? 24 : 16)) + ', ' + - ((h & (alpha ? 0x00ff0000 : 0x00ff00)) >>> (alpha ? 16 : 8)) + ', ' + - ((h & (alpha ? 0x0000ff00 : 0x0000ff)) >>> (alpha ? 8 : 0)) + - (alpha ? `, ${(h & 0x000000ff)}` : '') + ')'; -}; -``` - -```js -hexToRGB('#27ae60ff') -> 'rgba(39, 174, 96, 255)' -hexToRGB('27ae60') -> 'rgb(39, 174, 96)' -hexToRGB('#fff') -> 'rgb(255, 255, 255)' -``` - -[⬆ back to top](#table-of-contents) - -### isArray - -Checks if the given argument is an array. - -Use `Array.isArray()` to check if a value is classified as an array. - -```js -const isArray = val => !!val && Array.isArray(val); -``` - -```js -isArray(null) -> false -isArray([1]) -> true -``` - -[⬆ back to top](#table-of-contents) - -### isBoolean - -Checks if the given argument is a native boolean element. - -Use `typeof` to check if a value is classified as a boolean primitive. - -```js -const isBoolean = val => typeof val === 'boolean'; -``` - -```js -isBoolean(null) -> false -isBoolean(false) -> true -``` - -[⬆ back to top](#table-of-contents) - -### isFunction - -Checks if the given argument is a function. - -Use `typeof` to check if a value is classified as a function primitive. - -```js -const isFunction = val => val && typeof val === 'function'; -``` - -```js -isFunction('x') -> false -isFunction(x => x) -> true -``` - -[⬆ back to top](#table-of-contents) - -### isNumber - -Checks if the given argument is a number. - -Use `typeof` to check if a value is classified as a number primitive. - -```js -const isNumber = val => typeof val === 'number'; -``` - -```js -isNumber('1') -> false -isNumber(1) -> true -``` -[⬆ back to top](#table-of-contents) - -### isString - -Checks if the given argument is a string. - -Use `typeof` to check if a value is classified as a string primitive. - -```js -const isString = val => typeof val === 'string'; -``` - -```js -isString(10) -> false -isString('10') -> true -``` - -[⬆ back to top](#table-of-contents) - -### isSymbol - -Checks if the given argument is a symbol. - -Use `typeof` to check if a value is classified as a symbol primitive. - -```js -const isSymbol = val => typeof val === 'symbol'; -``` - -```js -isSymbol('x') -> false -isSymbol(Symbol('x')) -> true -``` - -[⬆ back to top](#table-of-contents) - -### randomHexColor - -Generates a random hexadecimal color code. - -Use `Math.random` to generate a random 24-bit(6x4bits) hexadecimal number. Use bit shifting and then convert it to an hexadecimal String using `toString(16)`. - -```js -const randomHexColorCode = () => '#'+(Math.random()*0xFFFFFF<<0).toString(16); -``` - -```js -randomHexColorCode() -> "#e34155" -randomHexColorCode() -> "#fd73a6" -randomHexColorCode() -> "#4144c6" -``` - -[⬆ back to top](#table-of-contents) - -### RGBToHex - -Converts the values of RGB components to a color code. - -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. - -```js -const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0'); -``` - -```js -RGBToHex(255, 165, 1) -> 'ffa501' -``` - -[⬆ back to top](#table-of-contents) - -### timeTaken - -Measures the time taken by a function to execute. - -Use `console.time()` and `console.timeEnd()` to measure the difference between the start and end times to determine how long the callback took to execute. - -```js -const timeTaken = callback => { - console.time('timeTaken'); const r = callback(); - console.timeEnd('timeTaken'); return r; -}; -``` - -```js -timeTaken(() => Math.pow(2, 10)) -> 1024 -(logged): timeTaken: 0.02099609375ms -``` - -[⬆ back to top](#table-of-contents) - -### toDecimalMark - -Use `toLocaleString()` to convert a float-point arithmetic to the [Decimal mark](https://en.wikipedia.org/wiki/Decimal_mark) form. It makes a comma separated string from a number. - - ```js -const toDecimalMark = num => num.toLocaleString("en-US"); -``` - -```js -toDecimalMark(12305030388.9087) -> "12,305,030,388.9087" -``` - -[⬆ back to top](#table-of-contents) - -### toOrdinalSuffix - -Adds an ordinal suffix to a number. - -Use the modulo operator (`%`) to find values of single and tens digits. -Find which ordinal pattern digits match. -If digit is found in teens pattern, use teens ordinal. - -```js -const toOrdinalSuffix = num => { - const int = parseInt(num), digits = [(int % 10), (int % 100)], - ordinals = ['st', 'nd', 'rd', 'th'], oPattern = [1, 2, 3, 4], - tPattern = [11, 12, 13, 14, 15, 16, 17, 18, 19]; - return oPattern.includes(digits[0]) && !tPattern.includes(digits[1]) ? int + ordinals[digits[0] - 1] : int + ordinals[3]; -}; -``` - -```js -toOrdinalSuffix("123") -> "123rd" -``` - -[⬆ back to top](#table-of-contents) - -### UUIDGenerator - -Generates a UUID. - -Use `crypto` API to generate a UUID, compliant with [RFC4122](https://www.ietf.org/rfc/rfc4122.txt) version 4. - -```js -const UUIDGenerator = () => - ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => - (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) - ); -``` - -```js -UUIDGenerator() -> '7982fcfe-5721-4632-bede-6000885be57d' -``` - -[⬆ back to top](#table-of-contents) - -### validateNumber - -Returns `true` if the given value is a number, `false` otherwise. - -Use `!isNaN` in combination with `parseFloat()` to check if the argument is a number. -Use `isFinite()` to check if the number is finite. -Use `Number()` to check if the coercion holds. - -```js -const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n; -``` - -```js -validateNumber('10') -> true -``` - -[⬆ back to top](#table-of-contents) - -## Credits - -*Icons made by [Smashicons](https://www.flaticon.com/authors/smashicons) from [www.flaticon.com](https://www.flaticon.com/) is licensed by [CC 3.0 BY](http://creativecommons.org/licenses/by/3.0/).* diff --git a/docs/index.html b/docs/index.html index 64c55e5af..00ba959b7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -33,7 +33,7 @@ }) } function clipboard() { - const snippets = document.querySelectorAll("pre"); + const snippets = document.querySelectorAll(":not(pre) + pre"); snippets.forEach(element => { const button = document.createElement("button"); button.innerHTML = "Copy to clipboard"; @@ -242,50 +242,46 @@

    call

    Given a key and a set of arguments, call them when given a context. Primarily useful in composition.

    Use a closure to call a stored key with stored arguments.

    -
    const call = (key, ...args) => context => context[ key ](...args);
    -/*
    -Promise.resolve( [ 1, 2, 3 ] ).then( call('map', x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ]
    +
    const call = ( key, ...args ) => context => context[ key ]( ...args );
    +
    +
    Promise.resolve( [ 1, 2, 3 ] ).then( call('map', x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ]
     const map = call.bind(null, 'map')
     Promise.resolve( [ 1, 2, 3 ] ).then( map( x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ]
    -*/
     

    collectInto

    Changes a function that accepts an array into a variadic function.

    Given a function, return a closure that collects all inputs into an array-accepting function.

    -
    const collectInto = fn => (...args) => fn(args);
    -/*
    -const Pall = collectInto( Promise.all.bind(Promise) )
    +
    const collectInto = fn => ( ...args ) => fn( args );
    +
    +
    const Pall = collectInto( Promise.all.bind(Promise) )
     let p1 = Promise.resolve(1)
     let p2 = Promise.resolve(2)
     let p3 = new Promise((resolve) => setTimeout(resolve,2000,3))
     Pall(p1, p2, p3).then(console.log)
    -*/
     

    flip

    Flip takes a function as an argument, then makes the first argument the last

    Return a closure that takes variadic inputs, and splices the last argument to make it the first argument before applying the rest.

    const flip = fn => (...args) => fn(args.pop(), ...args);
    -/*
    -let a = {name: 'John Smith'}
    +
    +
    let a = {name: 'John Smith'}
     let b = {}
     const mergeFrom = flip(Object.assign)
     let mergePerson = mergeFrom.bind(null, a)
     mergePerson(b) // == b
     b = {}
     Object.assign(b, a) // == b
    -*/
     

    pipeFunctions

    Performs left-to-right function composition.

    Use Array.reduce() with the spread operator (...) to perform left-to-right function composition. The first (leftmost) function can accept one or more arguments; the remaining functions must be unary.

    const pipeFunctions = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args)));
    -/*
    -const add5 = x => x + 5
    +
    +
    const add5 = x => x + 5
     const multiply = (x, y) => x * y
     const multiplyAndAdd5 = pipeFunctions(multiply, add5)
    -multiplyAndAdd5(5, 2) -> 15
    -*/
    +multiplyAndAdd5(5, 2) // 15
     

    promisify

    Converts an asynchronous function to return a promise.

    @@ -298,18 +294,18 @@ Use the ...rest operator to pass in all the parameters.

    func(...args, (err, result) => err ? reject(err) : resolve(result)) ); -// const delay = promisify((d, cb) => setTimeout(cb, d)) -// delay(2000).then(() => console.log('Hi!')) -> Promise resolves after 2s +
    +
    const delay = promisify((d, cb) => setTimeout(cb, d))
    +delay(2000).then(() => console.log('Hi!')) // // Promise resolves after 2s
     

    spreadOver

    Takes a variadic function and returns a closure that accepts an array of arguments to map to the inputs of the function.

    Use closures and the spread operator (...) to map the array of arguments to the inputs of the function.

    const spreadOver = fn => argsArr => fn(...argsArr);
    -/*
    -const arrayMax = spreadOver(Math.max)
    -arrayMax([1,2,3]) // -> 3
    -arrayMax([1,2,4]) // -> 4
    -*/
    +
    +
    const arrayMax = spreadOver(Math.max)
    +arrayMax([1,2,3]) // 3
    +arrayMax([1,2,4])  // 4
     

    Array

    arrayGcd

    @@ -317,33 +313,37 @@ arrayMax([1,2,4]) // -> 4

    Use Array.reduce() and the gcd formula (uses recursion) to calculate the greatest common denominator of an array of numbers.

    const arrayGcd = arr => {
       const gcd = (x, y) => !y ? x : gcd(y, x % y);
    -  return arr.reduce((a, b) => gcd(a, b));
    -};
    -// arrayGcd([1,2,3,4,5]) -> 1
    -// arrayGcd([4,8,12]) -> 4
    +  return arr.reduce((a,b) => gcd(a,b));
    +}
    +
    +
    arrayGcd([1,2,3,4,5]) // 1
    +arrayGcd([4,8,12]) // 4
     

    arrayLcm

    Calculates the lowest common multiple (lcm) of an array of numbers.

    Use Array.reduce() and the lcm formula (uses recursion) to calculate the lowest common multiple of an array of numbers.

    const arrayLcm = arr => {
       const gcd = (x, y) => !y ? x : gcd(y, x % y);
    -  const lcm = (x, y) => (x * y) / gcd(x, y);
    -  return arr.reduce((a, b) => lcm(a, b));
    -};
    -// arrayLcm([1,2,3,4,5]) -> 60
    -// arrayLcm([4,8,12]) -> 24
    +  const lcm = (x, y) => (x*y)/gcd(x, y);
    +  return arr.reduce((a,b) => lcm(a,b));
    +}
    +
    +
    arrayLcm([1,2,3,4,5]) // 60
    +arrayLcm([4,8,12]) // 24
     

    arrayMax

    Returns the maximum value in an array.

    Use Math.max() combined with the spread operator (...) to get the maximum value in the array.

    const arrayMax = arr => Math.max(...arr);
    -// arrayMax([10, 1, 5]) -> 10
    +
    +
    arrayMax([10, 1, 5]) // 10
     

    arrayMin

    Returns the minimum value in an array.

    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
    +
    +
    arrayMin([10, 1, 5]) // 1
     

    chunk

    Chunks an array into smaller arrays of a specified size.

    @@ -352,19 +352,22 @@ Use Array.slice() to map each element of the new array to a chunk t If the original array can't be split evenly, the final chunk will contain the remaining elements.

    const chunk = (arr, size) =>
       Array.from({length: Math.ceil(arr.length / size)}, (v, i) => arr.slice(i * size, i * size + size));
    -// chunk([1,2,3,4,5], 2) -> [[1,2],[3,4],[5]]
    +
    +
    chunk([1,2,3,4,5], 2) // [[1,2],[3,4],[5]]
     

    compact

    Removes falsey values from an array.

    Use Array.filter() to filter out falsey values (false, null, 0, "", undefined, and NaN).

    const compact = arr => arr.filter(Boolean);
    -// compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) -> [ 1, 2, 3, 'a', 's', 34 ]
    +
    +
    compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) // [ 1, 2, 3, 'a', 's', 34 ]
     

    countOccurrences

    Counts the occurrences of a value in an array.

    Use Array.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
    +
    +
    countOccurrences([1,1,2,1,2,3], 1) // 3
     

    deepFlatten

    Deep flattens an array.

    @@ -372,25 +375,29 @@ If the original array can't be split evenly, the final chunk will contain the re Use Array.concat() with an empty array ([]) and the spread operator (...) to flatten an array. Recursively flatten each element that is an array.

    const deepFlatten = arr => [].concat(...arr.map(v => Array.isArray(v) ? deepFlatten(v) : v));
    -// deepFlatten([1,[2],[[3],4],5]) -> [1,2,3,4,5]
    +
    +
    deepFlatten([1,[2],[[3],4],5]) // [1,2,3,4,5]
     

    difference

    Returns the difference between two arrays.

    Create a Set from b, then use Array.filter() on a to only keep values not contained in b.

    const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); };
    -// difference([1,2,3], [1,2,4]) -> [3]
    +
    +
    difference([1,2,3], [1,2,4]) // [3]
     

    differenceWith

    Filters out all values from an array for which the comparator function does not return true.

    Use Array.filter() and Array.find() to find the appropriate values.

    -
    const differenceWith = (arr, val, comp) => arr.filter(a => !val.find(b => comp(a, b)));
    -// differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) -> [1, 1.2]
    +
    const differenceWith = (arr, val, comp) => arr.filter(a => !val.find(b => comp(a, b)))
    +
    +
    differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) // [1, 1.2]
     

    distinctValuesOfArray

    Returns all the distinct values of an array.

    Use ES6 Set and the ...rest operator to discard all duplicated values.

    const distinctValuesOfArray = arr => [...new Set(arr)];
    -// distinctValuesOfArray([1,2,2,3,4,4,5]) -> [1,2,3,4,5]
    +
    +
    distinctValuesOfArray([1,2,2,3,4,4,5]) // [1,2,3,4,5]
     

    dropElements

    Removes elements in an array until the passed function returns true. Returns the remaining elements in the array.

    @@ -400,33 +407,38 @@ Returns the remaining elements.

    while (arr.length > 0 && !func(arr[0])) arr = arr.slice(1); return arr; }; -// dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4] +
    +
    dropElements([1, 2, 3, 4], n => n >= 3) // [3,4]
     

    dropRight

    Returns a new array with n elements removed from the right.

    Use Array.slice() to slice the remove the specified number of elements from the right.

    const dropRight = (arr, n = 1) => arr.slice(0, -n);
    -// dropRight([1,2,3]) -> [1,2]
    -// dropRight([1,2,3], 2) -> [1]
    -// dropRight([1,2,3], 42) -> []
    +
    +
    dropRight([1,2,3]) // [1,2]
    +dropRight([1,2,3], 2) // [1]
    +dropRight([1,2,3], 42) // []
     

    everyNth

    Returns every nth element in an array.

    Use Array.filter() to create a new array that contains every nth element of a given array.

    const everyNth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1);
    -// everyNth([1,2,3,4,5,6], 2) -> [ 2, 4, 6 ]
    +
    +
    everyNth([1,2,3,4,5,6], 2) // [ 2, 4, 6 ]
     

    filterNonUnique

    Filters out the non-unique values in an array.

    Use Array.filter() for an array containing only the unique values.

    const filterNonUnique = arr => arr.filter(i => arr.indexOf(i) === arr.lastIndexOf(i));
    -// filterNonUnique([1,2,2,3,4,4,5]) -> [1,3,5]
    +
    +
    filterNonUnique([1,2,2,3,4,4,5]) // [1,3,5]
     

    flatten

    Flattens an array.

    Use a new array and concatenate it with the spread input array causing a shallow denesting of any contained arrays.

    -
    const flatten = arr => [ ].concat(...arr);
    -// flatten([1,[2],3,4]) -> [1,2,3,4]
    +
    const flatten = arr => [ ].concat( ...arr );
    +
    +
    flatten([1,[2],3,4]) // [1,2,3,4]
     

    flattenDepth

    Flattens an array up to the specified depth.

    @@ -437,7 +449,8 @@ Omit the second element, depth to flatten only to a depth of
    const flattenDepth = (arr, depth = 1) =>
       depth != 1 ? arr.reduce((a, v) => a.concat(Array.isArray(v) ? flattenDepth(v, depth - 1) : v), [])
       : arr.reduce((a, v) => a.concat(v), []);
    -// flattenDepth([1,[2],[[[3],4],5]], 2) -> [1,2,[3],4,5]
    +
    +
    flatten([1,[2],3,4]) // [1,2,3,4]
     

    groupBy

    Groups the elements of an array based on the given function.

    @@ -446,26 +459,30 @@ Use Array.reduce() to create an object, where the keys are produced
    const groupBy = (arr, func) =>
       arr.map(typeof func === 'function' ? func : val => val[func])
         .reduce((acc, val, i) => { acc[val] = (acc[val] || []).concat(arr[i]); return acc; }, {});
    -// groupBy([6.1, 4.2, 6.3], Math.floor) -> {4: [4.2], 6: [6.1, 6.3]}
    -// groupBy(['one', 'two', 'three'], 'length') -> {3: ['one', 'two'], 5: ['three']}
    +
    +
    groupBy([6.1, 4.2, 6.3], Math.floor) // {4: [4.2], 6: [6.1, 6.3]}
    +groupBy(['one', 'two', 'three'], 'length') // {3: ['one', 'two'], 5: ['three']}
     

    Returns the head of a list.

    Use arr[0] to return the first element of the passed array.

    const head = arr => arr[0];
    -// head([1,2,3]) -> 1
    +
    +
    head([1,2,3]) // 1
     

    initial

    Returns all the elements of an array except the last one.

    Use arr.slice(0,-1) to return all but the last element of the array.

    const initial = arr => arr.slice(0, -1);
    -// initial([1,2,3]) -> [1,2]
    +
    +
    initial([1,2,3]) // [1,2]
     

    initialize2DArray

    Initializes a 2D array of given width and height and value.

    Use Array.map() to generate h rows where each is a new array of size w initialize with value. If the value is not provided, default to null.

    const initialize2DArray = (w, h, val = null) => Array(h).fill().map(() => Array(w).fill(val));
    -// initializeArrayWithRange(2, 2, 0) -> [[0,0], [0,0]]
    +
    +
    initialize2DArray(2, 2, 0) // [[0,0], [0,0]]
     

    initializeArrayWithRange

    Initializes an array containing the numbers in the specified range where start and end are inclusive.

    @@ -473,53 +490,58 @@ Use Array.reduce() to create an object, where the keys are produced You can omit start to use a default value of 0.

    const initializeArrayWithRange = (end, start = 0) =>
       Array.from({ length: (end + 1) - start }).map((v, i) => i + start);
    -// initializeArrayWithRange(5) -> [0,1,2,3,4,5]
    -// initializeArrayWithRange(7, 3) -> [3,4,5,6,7]
    +
    +
    initializeArrayWithRange(5) // [0,1,2,3,4,5]
    +initializeArrayWithRange(7, 3) // [3,4,5,6,7]
     

    initializeArrayWithValues

    Initializes and fills an array with the specified values.

    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 initializeArrayWithValues = (n, value = 0) => Array(n).fill(value);
    -// initializeArrayWithValues(5, 2) -> [2,2,2,2,2]
    +
    +
    initializeArrayWithValues(5, 2) // [2,2,2,2,2]
     

    intersection

    Returns a list of elements that exist in both arrays.

    Create a Set from b, then use Array.filter() on a to only keep values contained in b.

    const intersection = (a, b) => { const s = new Set(b); return a.filter(x => s.has(x)); };
    -// intersection([1,2,3], [4,3,2]) -> [2,3]
    +
    +
    intersection([1,2,3], [4,3,2]) // [2,3]
     

    last

    Returns the last element in an array.

    Use arr.length - 1 to compute the index of the last element of the given array and returning it.

    const last = arr => arr[arr.length - 1];
    -// last([1,2,3]) -> 3
    +
    +
    last([1,2,3]) // 3
     

    mapObject

    Maps the values of an array to an object using a function, where the key-value pairs consist of the original value as the key and the mapped value.

    Use an anonymous inner function scope to declare an undefined memory space, using closures to store a return value. Use a new Array to store the array with a map of the function over its data set and a comma operator to return a second step, without needing to move from one context to another (due to closures and order of operations).

    const mapObject = (arr, fn) =>
    -  (a => (a = [arr, arr.map(fn)], a[0].reduce((acc, val, ind) => (acc[val] = a[1][ind], acc), {})))();
    -/*
    -const squareIt = arr => mapObject(arr, a => a*a)
    +  (a => (a = [arr, arr.map(fn)], a[0].reduce( (acc,val,ind) => (acc[val] = a[1][ind], acc), {}) )) ( );
    +
    +
    const squareIt = arr => mapObject(arr, a => a*a)
     squareIt([1,2,3]) // { 1: 1, 2: 4, 3: 9 }
    -*/
     

    nthElement

    Returns the nth element of an array.

    Use Array.slice() to get an array containing the nth element at the first place. If the index is out of bounds, return []. Omit the second argument, n, to get the first element of the array.

    -
    const nthElement = (arr, n = 0) => (n > 0 ? arr.slice(n, n + 1) : arr.slice(n))[0];
    -// nthElement(['a','b','c'],1) -> 'b'
    -// nthElement(['a','b','b'],-3) -> 'a'
    +
    const nthElement = (arr, n=0) => (n>0? arr.slice(n,n+1) : arr.slice(n))[0];
    +
    +
    nthElement(['a','b','c'],1) // 'b'
    +nthElement(['a','b','b'],-3) // 'a'
     

    pick

    Picks the key-value pairs corresponding to the given keys from an object.

    Use Array.reduce() to convert the filtered/picked keys back to an object with the corresponding key-value pair if the key exists in the obj.

    const pick = (obj, arr) =>
       arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {});
    -// pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) -> { 'a': 1, 'c': 3 }
    +
    +
    pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) // { 'a': 1, 'c': 3 }
     

    pull

    Mutates the original array to filter out the values specified.

    @@ -532,14 +554,14 @@ Use Array.length = 0 to mutate the passed in an array by resetting arr.length = 0; pulled.forEach(v => arr.push(v)); }; +
    +
    let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c'];
    +pull(myArray1, 'a', 'c');
    +console.log(myArray1) // [ 'b', 'b' ]
     
    -// let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c'];
    -// pull(myArray1, 'a', 'c');
    -// console.log(myArray1) -> [ 'b', 'b' ]
    -
    -// let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c'];
    -// pull(myArray2, ['a', 'c']);
    -// console.log(myArray2) -> [ 'b', 'b' ]
    +let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c'];
    +pull(myArray2, ['a', 'c']);
    +console.log(myArray2) // [ 'b', 'b' ]
     

    pullAtIndex

    Mutates the original array to filter out the values at the specified indexes.

    @@ -549,17 +571,17 @@ Use Array.push() to keep track of pulled values

    const pullAtIndex = (arr, pullArr) => {
       let removed = [];
       let pulled = arr.map((v, i) => pullArr.includes(i) ? removed.push(v) : v)
    -                  .filter((v, i) => !pullArr.includes(i));
    +                  .filter((v, i) => !pullArr.includes(i))
       arr.length = 0;
       pulled.forEach(v => arr.push(v));
       return removed;
    -};
    +}
    +
    +
    let myArray = ['a', 'b', 'c', 'd'];
    +let pulled = pullAtIndex(myArray, [1, 3]);
     
    -// let myArray = ['a', 'b', 'c', 'd'];
    -// let pulled = pullAtIndex(myArray, [1, 3]);
    -
    -// console.log(myArray); -> [ 'a', 'c' ]
    -// console.log(pulled); -> [ 'b', 'd' ]
    +console.log(myArray); // [ 'a', 'c' ]
    +console.log(pulled); // [ 'b', 'd' ]
     

    pullAtValue

    Mutates the original array to filter out the values specified. Returns the removed elements.

    @@ -573,13 +595,12 @@ Use Array.push() to keep track of pulled values

    arr.length = 0; mutateTo.forEach(v => arr.push(v)); return removed; -}; -/* -let myArray = ['a', 'b', 'c', 'd']; +} +
    +
    let myArray = ['a', 'b', 'c', 'd'];
     let pulled = pullAtValue(myArray, ['b', 'd']);
    -console.log(myArray); -> [ 'a', 'c' ]
    -console.log(pulled); -> [ 'b', 'd' ]
    -*/
    +console.log(myArray); // [ 'a', 'c' ]
    +console.log(pulled); // [ 'b', 'd' ]
     

    remove

    Removes elements from an array for which the given function returns false.

    @@ -590,14 +611,16 @@ The func is invoked with three arguments (value, index, array arr.splice(arr.indexOf(val), 1); return acc.concat(val); }, []) : []; -// remove([1, 2, 3, 4], n => n % 2 == 0) -> [2, 4] + +
    remove([1, 2, 3, 4], n => n % 2 == 0) // [2, 4]
     

    sample

    Returns a random element from an array.

    Use Math.random() to generate a random number, multiply it by length and round it of to the nearest whole number using Math.floor(). This method also works with strings.

    const sample = arr => arr[Math.floor(Math.random() * arr.length)];
    -// sample([3, 7, 9, 11]) -> 9
    +
    +
    sample([3, 7, 9, 11]) // 9
     

    shuffle

    Randomizes the order of the values of an array, returning a new array.

    @@ -610,15 +633,17 @@ This method also works with strings.

    } return arr; }; -// const foo = [1,2,3] -// shuffle(foo) -> [2,3,1] -// console.log(foo) -> [1,2,3] +
    +
    const foo = [1,2,3]
    +shuffle(foo) // [2,3,1]
    +console.log(foo) // [1,2,3]
     

    similarity

    Returns an array of elements that appear in both arrays.

    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]
    +
    +
    similarity([1,2,3], [1,2,4]) // [1,2]
     

    symmetricDifference

    Returns the symmetric difference between two arrays.

    @@ -626,42 +651,48 @@ This method also works with strings.

    const symmetricDifference = (a, b) => {
       const sA = new Set(a), sB = new Set(b);
       return [...a.filter(x => !sB.has(x)), ...b.filter(x => !sA.has(x))];
    -};
    -// symmetricDifference([1,2,3], [1,2,4]) -> [3,4]
    +}
    +
    +
    symmetricDifference([1,2,3], [1,2,4]) // [3,4]
     

    tail

    Returns all elements in an array except for the first one.

    Return arr.slice(1) if the array's length is more than 1, otherwise, return the whole array.

    const tail = arr => arr.length > 1 ? arr.slice(1) : arr;
    -// tail([1,2,3]) -> [2,3]
    -// tail([1]) -> [1]
    +
    +
    tail([1,2,3]) // [2,3]
    +tail([1]) // [1]
     

    take

    Returns an array with n elements removed from the beginning.

    Use Array.slice() to create a slice of the array with n elements taken from the beginning.

    const take = (arr, n = 1) => arr.slice(0, n);
    -// take([1, 2, 3], 5) -> [1, 2, 3]
    -// take([1, 2, 3], 0) -> []
    +
    +
    take([1, 2, 3], 5) // [1, 2, 3]
    +take([1, 2, 3], 0) // []
     

    takeRight

    Returns an array with n elements removed from the end.

    Use Array.slice() to create a slice of the array with n elements taken from the end.

    const takeRight = (arr, n = 1) => arr.slice(arr.length - n, arr.length);
    -// takeRight([1, 2, 3], 2) -> [ 2, 3 ]
    -// takeRight([1, 2, 3]) -> [3]
    +
    +
    takeRight([1, 2, 3], 2) // [ 2, 3 ]
    +takeRight([1, 2, 3]) // [3]
     

    union

    Returns every element that exists in any of the two arrays once.

    Create a Set with all values of a and b and convert to an array.

    const union = (a, b) => Array.from(new Set([...a, ...b]));
    -// union([1,2,3], [4,3,2]) -> [1,2,3,4]
    +
    +
    union([1,2,3], [4,3,2]) // [1,2,3,4]
     

    without

    Filters out the elements of an array, that have one of the specified values.

    Use Array.filter() to create an array excluding(using !Array.includes()) all given values.

    (For a snippet that mutates the original array see pull)

    const without = (arr, ...args) => arr.filter(v => !args.includes(v));
    -// without([2, 1, 2, 3], 1, 2) -> [3]
    +
    +
    without([2, 1, 2, 3], 1, 2) // [3]
     

    zip

    Creates an array of elements, grouped based on the position in the original arrays.

    @@ -671,45 +702,51 @@ If lengths of the argument-arrays vary, undefined is used where no
    const zip = (...arrays) => {
       const maxLength = Math.max(...arrays.map(x => x.length));
       return Array.from({length: maxLength}).map((_, i) => {
    -    return Array.from({length: arrays.length}, (_, k) => arrays[k][i]);
    -  });
    -};
    -// zip(['a', 'b'], [1, 2], [true, false]); -> [['a', 1, true], ['b', 2, false]]
    -// zip(['a'], [1, 2], [true, false]); -> [['a', 1, true], [undefined, 2, false]]
    +   return Array.from({length: arrays.length}, (_, k) => arrays[k][i]);
    +  })
    +}
    +
    +
    zip(['a', 'b'], [1, 2], [true, false]); // [['a', 1, true], ['b', 2, false]]
    +zip(['a'], [1, 2], [true, false]); // [['a', 1, true], [undefined, 2, false]]
     

    zipObject

    Given an array of valid property identifiers and an array of values, return an object associating the properties to the values.

    Since an object can have undefined values but not undefined property pointers, the array of properties is used to decide the structure of the resulting object using Array.reduce().

    -
    const zipObject = (props, values) => props.reduce((obj, prop, index) => (obj[prop] = values[index], obj), {});
    -// zipObject(['a','b','c'], [1,2]) -> {a: 1, b: 2, c: undefined}
    -// zipObject(['a','b'], [1,2,3]) -> {a: 1, b: 2}
    +
    const zipObject = ( props, values ) => props.reduce( ( obj, prop, index ) => ( obj[prop] = values[index], obj ), {} )
    +
    +
    zipObject(['a','b','c'], [1,2]) // {a: 1, b: 2, c: undefined}
    +zipObject(['a','b'], [1,2,3]) // {a: 1, b: 2}
     

    Browser

    arrayToHtmlList

    Converts the given array elements into <li> tags and appends them to the list of the given id.

    Use Array.map() and document.querySelector() to create a list of html tags.

    -
    const arrayToHtmlList = (arr, listID) => arr.map(item => document.querySelector('#' + listID).innerHTML += `<li>${item}</li>`);
    -// arrayToHtmlList(['item 1', 'item 2'],'myListID')
    +
    const arrayToHtmlList = (arr, listID) => arr.map(item => document.querySelector("#"+listID).innerHTML+=`<li>${item}</li>`);
    +
    +
    arrayToHtmlList(['item 1', 'item 2'],'myListID')
     

    bottomVisible

    Returns true if the bottom of the page is visible, false otherwise.

    Use scrollY, scrollHeight and clientHeight to determine if the bottom of the page is visible.

    const bottomVisible = () =>
       document.documentElement.clientHeight + window.scrollY >= (document.documentElement.scrollHeight || document.documentElement.clientHeight);
    -// bottomVisible() -> true
    +
    +
    // bottomVisible() // true
     

    currentURL

    Returns the current URL.

    Use window.location.href to get current URL.

    const currentURL = () => window.location.href;
    -// currentUrl() -> 'https://google.com'
    +
    +
    currentUrl() // 'https://google.com'
     

    detectDeviceType

    Detects wether the website is being opened in a mobile device or a desktop/laptop.

    Use a regular expression to test the navigator.userAgent property to figure out if the device is a mobile device or a desktop/laptop.

    -
    const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? 'Mobile' : 'Desktop';
    -// detectDeviceType() -> "Mobile"
    -// detectDeviceType() -> "Desktop"
    +
    const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? "Mobile" : "Desktop";
    +
    +
    detectDeviceType() // "Mobile"
    +detectDeviceType() // "Desktop"
     

    elementIsVisibleInViewport

    Returns true if the element specified is visible in the viewport, false otherwise.

    @@ -725,9 +762,10 @@ it is partially visible.

    ((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth)) : top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth; }; -// e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10} -// elementIsVisibleInViewport(el) -> false (not fully visible) -// elementIsVisibleInViewport(el, true) -> true (partially visible) +
    +
    // e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10}
    +elementIsVisibleInViewport(el) // false // (not fully visible)
    +elementIsVisibleInViewport(el, true) // true // (partially visible)
     

    getScrollPosition

    Returns the scroll position of the current page.

    @@ -736,7 +774,8 @@ You can omit el to use a default value of window.

    const getScrollPosition = (el = window) =>
       ({x: (el.pageXOffset !== undefined) ? el.pageXOffset : el.scrollLeft,
         y: (el.pageYOffset !== undefined) ? el.pageYOffset : el.scrollTop});
    -// getScrollPosition() -> {x: 0, y: 200}
    +
    +
    getScrollPosition() // {x: 0, y: 200}
     

    getURLParameters

    Returns an object containing the parameters of the current URL.

    @@ -746,7 +785,8 @@ Pass location.search as the argument to apply to the current url.match(/([^?=&]+)(=([^&]*))/g).reduce( (a, v) => (a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1), a), {} ); -// getURLParameters('http://url.com/page?name=Adam&surname=Smith') -> {name: 'Adam', surname: 'Smith'} + +
    getURLParameters('http://url.com/page?name=Adam&surname=Smith') // {name: 'Adam', surname: 'Smith'}
     

    httpsRedirect

    Redirects the page to HTTPS if its currently in HTTP. Also, pressing the back button doesn't take it back to the HTTP page as its replaced in the history.

    @@ -761,7 +801,8 @@ Pass location.search as the argument to apply to the current 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')
    +
    +
    redirect('https://google.com')
     

    scrollToTop

    Smooth-scrolls to the top of the page.

    @@ -774,14 +815,16 @@ Scroll by a fraction of the distance from the top. Use window.requestAnima window.scrollTo(0, c - c / 8); } }; -// scrollToTop() + +
    scrollToTop()
     

    Date

    getDaysDiffBetweenDates

    Returns the difference (in days) between two dates.

    Calculate the difference (in days) between two Date objects.

    const getDaysDiffBetweenDates = (dateInitial, dateFinal) => (dateFinal - dateInitial) / (1000 * 3600 * 24);
    -// getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) -> 9
    +
    +
    getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) // 9
     

    JSONToDate

    Converts a JSON object to a date.

    @@ -790,14 +833,16 @@ Scroll by a fraction of the distance from the top. Use window.requestAnima const dt = new Date(parseInt(arr.toString().substr(6))); return `${dt.getDate()}/${dt.getMonth() + 1}/${dt.getFullYear()}`; }; -// JSONToDate(/Date(1489525200000)/) -> "14/3/2017" + +
    JSONToDate(/Date(1489525200000)/) // "14/3/2017"
     

    toEnglishDate

    Converts a date from American format to English format.

    Use Date.toISOString(), split('T') and replace() to convert a date from American format to the English format. Throws an error if the passed time cannot be converted to a date.

    const toEnglishDate = (time) => { try { return new Date(time).toISOString().split('T')[0].replace(/-/g, '/'); } catch (e) {} };
    -// toEnglishDate('09/21/2010') -> '21/09/2010'
    +
    +
    toEnglishDate('09/21/2010') // '21/09/2010'
     

    tomorrow

    Results in a string representation of tomorrow's date. @@ -810,25 +855,23 @@ Use new Date() to get today's date, adding 86400000 of

    Chains asynchronous functions.

    Loop through an array of functions containing asynchronous events, calling next when each asynchronous event has completed.

    const chainAsync = fns => { let curr = 0; const next = () => fns[curr++](next); next(); };
    -/*
    -chainAsync([
    +
    +
    chainAsync([
       next => { console.log('0 seconds'); setTimeout(next, 1000); },
       next => { console.log('1 second');  setTimeout(next, 1000); },
       next => { console.log('2 seconds'); }
     ])
    -*/
     

    compose

    Performs right-to-left function composition.

    Use Array.reduce() to perform right-to-left function composition. The last (rightmost) function can accept one or more arguments; the remaining functions must be unary.

    const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args)));
    -/*
    -const add5 = x => x + 5
    +
    +
    const add5 = x => x + 5
     const multiply = (x, y) => x * y
     const multiplyAndAdd5 = compose(add5, multiply)
    -multiplyAndAdd5(5, 2) -> 15
    -*/
    +multiplyAndAdd5(5, 2) // 15
     

    curry

    Curries a function.

    @@ -840,83 +883,92 @@ If you want to curry a function that accepts a variable number of arguments (a v arity <= args.length ? fn(...args) : curry.bind(null, fn, arity, ...args); -// curry(Math.pow)(2)(10) -> 1024 -// curry(Math.min, 3)(10)(50)(2) -> 2 +
    +
    curry(Math.pow)(2)(10) // 1024
    +curry(Math.min, 3)(10)(50)(2) // 2
     

    functionName

    Logs the name of a function.

    Use console.debug() and the name property of the passed method to log the method's name to the debug channel of the console.

    const functionName = fn => (console.debug(fn.name), fn);
    -// functionName(Math.max) -> max (logged in debug channel of console)
    +
    +
    functionName(Math.max) // max (logged in debug channel of console)
     

    runPromisesInSeries

    Runs an array of promises in series.

    Use Array.reduce() to create a promise chain, where each promise returns the next promise when resolved.

    const runPromisesInSeries = ps => ps.reduce((p, next) => p.then(next), Promise.resolve());
    -// const delay = (d) => new Promise(r => setTimeout(r, d))
    -// runPromisesInSeries([() => delay(1000), () => delay(2000)]) -> executes each promise sequentially, taking a total of 3 seconds to complete
    +
    +
    const delay = (d) => new Promise(r => setTimeout(r, d))
    +runPromisesInSeries([() => delay(1000), () => delay(2000)]) // //executes each promise sequentially, taking a total of 3 seconds to complete
     

    sleep

    Delays the execution of an asynchronous function.

    Delay executing part of an async function, by putting it to sleep, returning a Promise.

    const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
    -/*
    -async function sleepyWork() {
    +
    +
    async function sleepyWork() {
       console.log('I\'m going to sleep for 1 second.');
       await sleep(1000);
       console.log('I woke up after 1 second.');
     }
    -*/
     

    Logic

    negate

    Negates a predicate function.

    Take a predicate function and apply not to it with its arguments.

    const negate = func => (...args) => !func(...args);
    -// filter([1, 2, 3, 4, 5, 6], negate(isEven)) -> [1, 3, 5]
    -// negate(isOdd)(1) -> false
    +
    +
    filter([1, 2, 3, 4, 5, 6], negate(isEven)) // [1, 3, 5]
    +negate(isOdd)(1) // false
     

    Math

    arrayAverage

    Returns the average of an array of numbers.

    Use Array.reduce() to add each value to an accumulator, initialized with a value of 0, divide by the length of the array.

    const arrayAverage = arr => arr.reduce((acc, val) => acc + val, 0) / arr.length;
    -// arrayAverage([1,2,3]) -> 2
    +
    +
    arrayAverage([1,2,3]) // 2
     

    arraySum

    Returns the sum of an array of numbers.

    Use Array.reduce() to add each value to an accumulator, initialized with a value of 0.

    const arraySum = arr => arr.reduce((acc, val) => acc + val, 0);
    -// arraySum([1,2,3,4]) -> 10
    +
    +
    arraySum([1,2,3,4]) // 10
     

    clampNumber

    -

    Clamps num within the inclusive range specified by the boundary values a and b

    +

    Clamps num within the inclusive range specified by the boundary values a and b.

    If num falls within the range, return num. Otherwise, return the nearest number in the range.

    const clampNumber = (num, a, b) => Math.max(Math.min(num, Math.max(a,b)),Math.min(a,b));
    -// clampNumber(2, 3, 5) -> 3
    -// clampNumber(1, -1, -5) -> -1
    -// clampNumber(3, 2, 4) -> 3
    +
    +
    clampNumber(2, 3, 5) // 3
    +clampNumber(1, -1, -5) // -1
    +clampNumber(3, 2, 4) // 3
     

    collatz

    Applies the Collatz algorithm.

    If n is even, return n/2. Otherwise, return 3n+1.

    const collatz = n => (n % 2 == 0) ? (n / 2) : (3 * n + 1);
    -// collatz(8) --> 4
    -// collatz(5) --> 16
    +
    +
    collatz(8) // 4
    +collatz(5) // 16
     

    digitize

    Converts a number to an array of digits.

    Convert the number to a string, using spread operators in ES6([...string]) build an array. Use Array.map() and parseInt() to transform each value to an integer.

    -
    const digitize = n => [...'' + n].map(i => parseInt(i));
    -// digitize(2334) -> [2, 3, 3, 4]
    +
    const digitize = n => [...''+n].map(i => parseInt(i));
    +
    +
    differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) // [1, 1.2]
     

    distance

    Returns the distance between two points.

    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
    +
    +
    distance(1,1, 2,3) // 2.23606797749979
     

    factorial

    Calculates the factorial of a number.

    @@ -927,7 +979,8 @@ Throws an exception if n is a negative number.

    const factorial = n =>
       n < 0 ? (() => { throw new TypeError('Negative numbers are not allowed!'); })()
       : n <= 1 ? 1 : n * factorial(n - 1);
    -// factorial(6) -> 720
    +
    +
    factorial(6) // 720
     

    fibonacci

    Generates an array, containing the Fibonacci sequence, up until the nth term.

    @@ -935,14 +988,16 @@ Throws an exception if n is a negative number.

    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.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []);
    -// fibonacci(5) -> [0,1,1,2,3]
    +
    +
    factorial(6) // 720
     

    fibonacciCountUntilNum

    Returns the number of fibonnacci numbers up to num(0 and num inclusive).

    Use a mathematical formula to calculate the number of fibonacci numbers until num.

    const fibonacciCountUntilNum = num =>
    -  Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2));
    -// fibonacciCountUntilNum(10) -> 7
    +  Math.ceil(Math.log(num * Math.sqrt(5) + 1/2) / Math.log((Math.sqrt(5)+1)/2));
    +
    +
    fibonacciCountUntilNum(10) // 7
     

    fibonacciUntilNum

    Generates an array, containing the Fibonacci sequence, up until the nth term.

    @@ -952,8 +1007,9 @@ Uses a mathematical formula to calculate the length of the array required.

    const fibonacciUntilNum = num => {
       let n = Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2));
       return Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []);
    -};
    -// fibonacciUntilNum(15) -> [0,1,1,2,3,5,8,13]
    +}
    +
    +
    fibonacciCountUntilNum(10) // 7
     

    gcd

    Calculates the greatest common divisor between two numbers.

    @@ -961,7 +1017,8 @@ Uses a mathematical formula to calculate the length of the array required.

    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
    +
    +
    gcd (8, 36) // 4
     

    hammingDistance

    Calculates the Hamming distance between two values.

    @@ -969,42 +1026,47 @@ Otherwise, return the GCD of y and the remainder of the division 1
    s in the string, using match(/1/g).

    const hammingDistance = (num1, num2) =>
       ((num1 ^ num2).toString(2).match(/1/g) || '').length;
    -// hammingDistance(2,3) -> 1
    +
    +
    hammingDistance(2,3) // 1
     

    inRange

    Checks if the given number falls within the given range.

    Use arithmetic comparison to check if the given number is in the specified range. If the second parameter, end, is not specified, the range is considered to be from 0 to start.

    -
    const inRange = (n, start, end = null) => {
    -  if (end && start > end) end = [start, start = end][0];
    -  return (end == null) ? (n >= 0 && n < start) : (n >= start && n < end);
    -};
    -// inRange(3, 2, 5) -> true
    -// inRange(3, 4) -> true
    -// inRange(2, 3, 5) -> false
    -// inrange(3, 2) -> false
    +
    const inRange = (n, start, end=null) => {
    +  if(end && start > end) end = [start, start=end][0];
    +  return (end == null) ? (n>=0 && n<start) : (n>=start && n<end);
    +}
    +
    +
    inRange(3, 2, 5) // true
    +inRange(3, 4) // true
    +inRange(2, 3, 5) // false
    +inrange(3, 2) // false
     

    isArmstrongNumber

    Checks if the given number is an Armstrong number or not.

    Convert the given number into an array of digits. Use Math.pow() to get the appropriate power for each digit and sum them up. If the sum is equal to the number itself, return true otherwise false.

    const isArmstrongNumber = digits =>
    -  (arr => arr.reduce((a, d) => a + Math.pow(parseInt(d), arr.length), 0) == digits)((digits + '').split(''));
    -// isArmstrongNumber(1634) -> true
    -// isArmstrongNumber(371) -> true
    -// isArmstrongNumber(56) -> false
    +  ( arr => arr.reduce( ( a, d ) => a + Math.pow( parseInt( d ), arr.length ), 0 ) == digits ? true : false )( ( digits+'' ).split( '' ) );
    +
    +
    isArmstrongNumber(1634) // true
    +isArmstrongNumber(371) // true
    +isArmstrongNumber(56) // false
     

    isDivisible

    Checks if the first numeric argument is divisible by the second one.

    Use the modulo operator (%) to check if the remainder is equal to 0.

    const isDivisible = (dividend, divisor) => dividend % divisor === 0;
    -// isDivisible(6,3) -> true
    +
    +
    isDivisible(6,3) // true
     

    isEven

    Returns true if the given number is even, false otherwise.

    Checks whether a number is odd or even using the modulo (%) operator. Returns true if the number is even, false if the number is odd.

    const isEven = num => num % 2 === 0;
    -// isEven(3) -> false
    +
    +
    isEven(3) // false
     

    isPrime

    Checks if the provided integer is a prime number.

    @@ -1015,8 +1077,9 @@ Return false if any of them divides the given number, else return < for (var i = 2; i * i <= boundary; i++) if (num % i == 0) return false; return num >= 2; }; -// isPrime(11) -> true -// isPrime(12) -> false +
    +
    isPrime(11) // true
    +isPrime(12) // false
     

    lcm

    Returns the least common multiple of two numbers.

    @@ -1026,7 +1089,8 @@ The GCD formula uses recursion.

    const gcd = (x, y) => !y ? x : gcd(y, x % y); return Math.abs(x * y) / (gcd(x, y)); }; -// lcm(12,7) -> 84 +
    +
    lcm(12,7) // 84
     

    median

    Returns the median of an array of numbers.

    @@ -1036,8 +1100,9 @@ Return the number at the midpoint if length is odd, otherwise the a const mid = Math.floor(arr.length / 2), nums = [...arr].sort((a, b) => a - b); return arr.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2; }; -// median([5,6,50,1,-5]) -> 5 -// median([0,10,-2,7]) -> 3.5 + +
    median([5,6,50,1,-5]) // 5
    +median([0,10,-2,7]) // 3.5
     

    palindrome

    Returns true if the given string is a palindrome, false otherwise.

    @@ -1047,52 +1112,59 @@ Then, split('') into individual characters, reverse(), const s = str.toLowerCase().replace(/[\W_]/g,''); return s === s.split('').reverse().join(''); } -// palindrome('taco cat') -> true + +
    palindrome('taco cat') // true
     

    percentile

    Uses the percentile formula to calculate how many numbers in the given array are less or equal to the given value.

    Use Array.reduce() to calculate how many numbers are below the value and how many are the same value and apply the percentile formula.

    const percentile = (arr, val) =>
       100 * arr.reduce((acc,v) => acc + (v < val ? 1 : 0) + (v === val ? 0.5 : 0), 0) / arr.length;
    -// percentile([1,2,3,4,5,6,7,8,9,10], 6) -> 55
    +
    +
    percentile([1,2,3,4,5,6,7,8,9,10], 6) // 55
     

    powerset

    Returns the powerset of a given array of numbers.

    Use Array.reduce() combined with Array.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]]
    +
    +
    powerset([1,2]) // [[], [1], [2], [2,1]]
     

    primes

    Generates primes up to a given number, using the Sieve of Eratosthenes.

    Generate an array from 2 to the given number. Use Array.filter() to filter out the values divisible by any number from 2 to the square root of the provided number.

    const primes = num => {
    -  let arr = Array.from({length: num - 1}).map((x, i) => i + 2),
    -    sqroot = Math.floor(Math.sqrt(num)),
    -    numsTillSqroot = Array.from({length: sqroot - 1}).map((x, i) => i + 2);
    -  numsTillSqroot.forEach(x => arr = arr.filter(y => ((y % x) !== 0) || (y == x)));
    +  let arr =  Array.from({length:num-1}).map((x,i)=> i+2),
    +    sqroot  = Math.floor(Math.sqrt(num)),
    +    numsTillSqroot  = Array.from({length:sqroot-1}).map((x,i)=> i+2);
    +  numsTillSqroot.forEach(x => arr = arr.filter(y => ((y%x)!==0)||(y==x)));
       return arr;
    -};
    -// primes(10) -> [2,3,5,7]
    +}
    +
    +
    primes(10) // [2,3,5,7]
     

    randomIntegerInRange

    Returns a random integer in the specified range.

    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
    +
    +
    randomIntegerInRange(0, 5) // 2
     

    randomNumberInRange

    Returns a random number in the specified range.

    Use Math.random() to generate a random value, map it to the desired range using multiplication.

    const randomNumberInRange = (min, max) => Math.random() * (max - min) + min;
    -// randomNumberInRange(2,10) -> 6.0211363285087005
    +
    +
    randomNumberInRange(2,10) // 6.0211363285087005
     

    round

    Rounds a number to a specified amount of digits.

    Use Math.round() and template literals to round the number to the specified number of digits. Omit the second argument, decimals to round to an integer.

    -
    const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`);
    -// round(1.005, 2) -> 1.01
    +
    const round = (n, decimals=0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`);
    +
    +
    round(1.005, 2) // 1.01
     

    sdbmHashAlgorithm

    This algorithm is a simple hash-algorithm that hashes it input string s into a whole number.

    @@ -1118,8 +1190,9 @@ You can omit the second argument to get the sample standard deviation or set it .reduce((acc, val) => acc + val, 0) / (arr.length - (usePopulation ? 0 : 1)) ); }; -// standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample) -// standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population) +
    +
    standardDeviation([10,2,38,23,38,23,21]) // 13.284434142114991 (sample)
    +standardDeviation([10,2,38,23,38,23,21], true) // 12.29899614287479 (population)
     

    Media

    speechSynthesis

    @@ -1132,15 +1205,17 @@ Use window.speechSynthesis.speak() to play the message.

    msg.voice = window.speechSynthesis.getVoices()[0]; window.speechSynthesis.speak(msg); }; -// speechSynthesis('Hello, World') -> plays the message + +
    speechSynthesis('Hello, World') // // plays the message
     

    Node

    JSONToFile

    Writes a JSON object to a file.

    Use fs.writeFile(), template literals and JSON.stringify() to write a json object to a .json file.

    const fs = require('fs');
    -const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2));
    -// JSONToFile({test: "is passed"}, 'testJsonFile') -> writes the object to 'testJsonFile.json'
    +const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2))
    +
    +
    JSONToFile({test: "is passed"}, 'testJsonFile') // writes the object to 'testJsonFile.json'
     

    readFileLines

    Returns an array of lines from the specified file.

    @@ -1148,16 +1223,25 @@ const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.s convert buffer to string using toString(encoding) function. creating an array from contents of file by spliting file content line by line (each \n).

    const fs = require('fs');
    -const readFileLines = filename => fs.readFileSync(filename).toString('UTF8').split(/\r?\n/);
    -/*
    -  contents of test.txt :
    -    line1
    -    line2
    -    line3
    -    ___________________________
    -  let arr = readFileLines('test.txt')
    -  console.log(arr) // -> ['line1', 'line2', 'line3']
    - */
    +const readFileLines = filename => fs.readFileSync(filename).toString('UTF8').split('\n');
    +
    +
    /*
    +contents of test.txt :
    +  line1
    +  line2
    +  line3
    +  ___________________________
    +*/
    +let arr = readFileLines('test.txt')
    +console.log(arr) // ['line1', 'line2', 'line3']
    +
    +
    contents of test.txt :
    +  line1
    +  line2
    +  line3
    +  ___________________________
    +let arr = readFileLines('test.txt')
    +console.log(arr) // // ['line1', 'line2', 'line3']
     

    Object

    cleanObj

    @@ -1174,22 +1258,23 @@ Also if you give it a special key (childIndicator) it will search d  }); return obj; }; -/* - const testObj = {a: 1, b: 2, children: {a: 1, b: 2}} - cleanObj(testObj, ["a"],"children") // { a: 1, children : { a: 1}} -*/ + +
    const testObj = {a: 1, b: 2, children: {a: 1, b: 2}}
    +cleanObj(testObj, ["a"],"children") // { a: 1, children : { a: 1}}
     

    objectFromPairs

    Creates an object from the given key-value pairs.

    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}
    +
    +
    objectFromPairs([['a',1],['b',2]]) // {a: 1, b: 2}
     

    objectToPairs

    Creates an array of key-value pair arrays from an object.

    Use Object.keys() and Array.map() to iterate over the object's keys and produce an array with key-value pairs.

    const objectToPairs = obj => Object.keys(obj).map(k => [k, obj[k]]);
    -// objectToPairs({a: 1, b: 2}) -> [['a',1],['b',2]])
    +
    +
    objectToPairs({a: 1, b: 2}) // [['a',1],['b',2]])
     

    orderBy

    Returns a sorted array of objects ordered by properties and orders.

    @@ -1205,37 +1290,36 @@ If no orders array is passed it sort by 'asc' by default.

    return acc; }, 0) ); -/* -const users = [{ 'name': 'fred', 'age': 48 },{ 'name': 'barney', 'age': 36 }, + +
    const users = [{ 'name': 'fred',   'age': 48 },{ 'name': 'barney', 'age': 36 },
       { 'name': 'fred',   'age': 40 },{ 'name': 'barney', 'age': 34 }];
    -orderby(users, ['name', 'age'], ['asc', 'desc']) -> [{name: 'barney', age: 36}, {name: 'barney', age: 34}, {name: 'fred', age: 48}, {name: 'fred', age: 40}]
    -orderby(users, ['name', 'age']) -> [{name: 'barney', age: 34}, {name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}]
    -*/
    +orderby(users, ['name', 'age'], ['asc', 'desc']) // [{name: 'barney', age: 36}, {name: 'barney', age: 34}, {name: 'fred', age: 48}, {name: 'fred', age: 40}]
    +orderby(users, ['name', 'age']) // [{name: 'barney', age: 34}, {name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}]
     

    select

    Retrieve a property that indicated by the selector from an object.

    If the property does not exists returns undefined.

    const select = (from, selector) =>
       selector.split('.').reduce((prev, cur) => prev && prev[cur], from);
    -
    -// const obj = {selector: {to: {val: 'val to select'}}};
    -// select(obj, 'selector.to.val'); -> 'val to select'
    +
    +
    const obj = {selector: {to: {val: 'val to select'}}};
    +select(obj, 'selector.to.val'); // 'val to select'
     

    shallowClone

    Creates a shallow clone of an object.

    Use Object.assign() and an empty object ({}) to create a shallow clone of the original.

    const shallowClone = obj => Object.assign({}, obj);
    -/*
    -const a = { x: true, y: 1 };
    +
    +
    const a = { x: true, y: 1 };
     const b = shallowClone(a);
    -a === b -> false
    -*/
    +a === b // false
     

    truthCheckCollection

    Checks if the predicate (second argument) is truthy on all elements of a collection (first argument).

    Use Array.every() to check if each passed object has the specified property and if it returns a truthy value.

    const truthCheckCollection = (collection, pre) => (collection.every(obj => obj[pre]));
    -// truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") -> true
    +
    +
    truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") // true
     

    String

    anagrams

    @@ -1249,7 +1333,8 @@ Base cases are for string length equal to 2 or 1 return str.split('').reduce((acc, letter, i) => acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)), []); }; -// anagrams('abc') -> ['abc','acb','bac','bca','cab','cba'] + +
    anagrams('abc') // ['abc','acb','bac','bca','cab','cba']
     

    Capitalize

    Capitalizes the first letter of a string.

    @@ -1257,27 +1342,31 @@ Base cases are for string length equal to 2 or 1 Omit the lowerRest parameter to keep the rest of the string intact, or set it to true to convert to lowercase.

    const capitalize = ([first, ...rest], lowerRest = false) =>
       first.toUpperCase() + (lowerRest ? rest.join('').toLowerCase() : rest.join(''));
    -// capitalize('myName') -> 'MyName'
    -// capitalize('myName', true) -> 'Myname'
    +
    +
    capitalize('fooBar') // 'FooBar'
    +capitalize('fooBar', true) // 'Foobar'
     

    capitalizeEveryWord

    Capitalizes the first letter of every word in a string.

    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!'
    +
    +
    capitalizeEveryWord('hello world!') // 'Hello World!'
     

    countVowels

    Retuns number of vowels in provided string.

    Use a regular expression to count the number of vowels (A, E, I, O, U) in a string.

    const countVowels = str => (str.match(/[aeiou]/ig) || []).length;
    -// countVowels('foobar') -> 3
    -// countVowels('gym') -> 0
    +
    +
    countVowels('foobar') // 3
    +countVowels('gym') // 0
     

    escapeRegExp

    Escapes a string to use in a regular expression.

    Use replace() to escape special characters.

    const escapeRegExp = str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    -// escapeRegExp('(test)') -> \\(test\\)
    +
    +
    escapeRegExp('(test)') // \\(test\\)
     

    fromCamelCase

    Converts a string from camelcase.

    @@ -1286,32 +1375,36 @@ Omit the second argument to use a default separator of _.

    const fromCamelCase = (str, separator = '_') =>
       str.replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2')
         .replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + separator + '$2').toLowerCase();
    -// fromCamelCase('someDatabaseFieldName', ' ') -> 'some database field name'
    -// fromCamelCase('someLabelThatNeedsToBeCamelized', '-') -> 'some-label-that-needs-to-be-camelized'
    -// fromCamelCase('someJavascriptProperty', '_') -> 'some_javascript_property'
    +
    +
    fromCamelCase('someDatabaseFieldName', ' ') // 'some database field name'
    +fromCamelCase('someLabelThatNeedsToBeCamelized', '-') // 'some-label-that-needs-to-be-camelized'
    +fromCamelCase('someJavascriptProperty', '_') // 'some_javascript_property'
     

    repeatString

    Repeats a string n times using String.repeat()

    If no string is provided the default is "" and the default number of times is 2.

    -
    const repeatString = (str = '', num = 2) => {
    -  return num >= 0 ? str.repeat(num) : str;
    -};
    -// repeatString("abc",3) -> 'abcabcabc'
    -// repeatString("abc") -> 'abcabc'
    +
    const repeatString = (str="",num=2) => {
    +    return num >= 0 ? str.repeat(num) : str;
    +}
    +
    +
    repeatString("abc",3) // 'abcabcabc'
    +repeatString("abc") // 'abcabc'
     

    reverseString

    Reverses a string.

    Use split('') 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.split('').reverse().join('');
    -// reverseString('foobar') -> 'raboof'
    +
    +
    reverseString('foobar') // 'raboof'
     

    sortCharactersInString

    Alphabetically sorts the characters in a string.

    Split the string using split(''), Array.sort() utilizing localeCompare(), recombine using join('').

    const sortCharactersInString = str =>
       str.split('').sort((a, b) => a.localeCompare(b)).join('');
    -// sortCharactersInString('cabbage') -> 'aabbceg'
    +
    +
    sortCharactersInString('cabbage') // 'aabbceg'
     





    words

    Converts a given string into an array of words.

    Use String.split() with a supplied pattern (defaults to non-alpha as a regex) to convert to an array of strings. Use Array.filter() to remove any empty strings. Omit the second argument to use the default regex.

    const words = (str, pattern = /[^a-zA-Z-]+/) => str.split(pattern).filter(Boolean);
    -// words("I love javaScript!!") -> ["I", "love", "javaScript"]
    -// words("python, javaScript & coffee") -> ["python", "javaScript", "coffee"]
    +
    +
    words("I love javaScript!!") // ["I", "love", "javaScript"]
    +words("python, javaScript & coffee") // ["python", "javaScript", "coffee"]
     

    Utility

    coalesce

    Returns the first non-null/undefined argument.

    Use Array.find() to return the first non null/undefined argument.

    -
    const coalesce = (...args) => args.find(_ => ![undefined, null].includes(_));
    -// coalesce(null,undefined,"",NaN, "Waldo") -> ""
    +
    const coalesce = (...args) => args.find(_ => ![undefined, null].includes(_))
    +
    +
    coalesce(null,undefined,"",NaN, "Waldo") // ""
     

    coalesceFactory

    Returns a customized coalesce function that returns the first argument that returns true from the provided argument validation function.

    Use Array.find() to return the first argument that returns true from the provided argument validation function.

    const coalesceFactory = valid => (...args) => args.find(valid);
    -// const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_))
    -// customCoalesce(undefined, null, NaN, "", "Waldo") //-> "Waldo"
    +
    +
    const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_))
    +customCoalesce(undefined, null, NaN, "", "Waldo") // "Waldo"
     

    extendHex

    Extends a 3-digit color code to a 6-digit color code.

    Use Array.map(), split() and Array.join() to join the mapped array for converting a 3-digit RGB notated hexadecimal color-code to the 6-digit form. String.slice() is used to remove # from string start since it's added once.

    const extendHex = shortHex =>
    -  '#' + shortHex.slice(shortHex.startsWith('#') ? 1 : 0).split('').map(x => x + x).join('');
    -// extendHex('#03f') -> '#0033ff'
    -// extendHex('05a') -> '#0055aa'
    +  '#' + shortHex.slice(shortHex.startsWith('#') ? 1 : 0).split('').map(x => x+x).join('')
    +
    +
    extendHex('#03f') // '#0033ff'
    +extendHex('05a') // '#0055aa'
     

    getType

    Returns the native type of a value.

    Returns lowercased constructor name of value, "undefined" or "null" if value is undefined or null

    const getType = v =>
       v === undefined ? 'undefined' : v === null ? 'null' : v.constructor.name.toLowerCase();
    -// getType(new Set([1,2,3])) -> "set"
    +
    +
    getType(new Set([1,2,3])) // "set"
     

    hexToRGB

    Converts a color code to a rgb() or rgba() string if alpha value is provided.

    @@ -1418,51 +1520,58 @@ Omit the second argument to use the default regex.

    ((h & (alpha ? 0x0000ff00 : 0x0000ff)) >>> (alpha ? 8 : 0)) + (alpha ? `, ${(h & 0x000000ff)}` : '') + ')'; }; -// hexToRGB('#27ae60ff') -> 'rgba(39, 174, 96, 255)' -// hexToRGB('27ae60') -> 'rgb(39, 174, 96)' -// hexToRGB('#fff') -> 'rgb(255, 255, 255)' +
    +
    hexToRGB('#27ae60ff') // 'rgba(39, 174, 96, 255)'
    +hexToRGB('27ae60') // 'rgb(39, 174, 96)'
    +hexToRGB('#fff') // 'rgb(255, 255, 255)'
     

    isArray

    Checks if the given argument is an array.

    Use Array.isArray() to check if a value is classified as an array.

    const isArray = val => !!val && Array.isArray(val);
    -// isArray(null) -> false
    -// isArray([1]) -> true
    +
    +
    isArray(null) // false
    +isArray([1]) // true
     

    isBoolean

    Checks if the given argument is a native boolean element.

    Use typeof to check if a value is classified as a boolean primitive.

    const isBoolean = val => typeof val === 'boolean';
    -// isBoolean(null) -> false
    -// isBoolean(false) -> true
    +
    +
    isBoolean(null) // false
    +isBoolean(false) // true
     

    isFunction

    Checks if the given argument is a function.

    Use typeof to check if a value is classified as a function primitive.

    const isFunction = val => val && typeof val === 'function';
    -// isFunction('x') -> false
    -// isFunction(x => x) -> true
    +
    +
    isFunction('x') // false
    +isFunction(x => x) // true
     

    isNumber

    Checks if the given argument is a number.

    Use typeof to check if a value is classified as a number primitive.

    const isNumber = val => typeof val === 'number';
    -// isNumber('1') -> false
    -// isNumber(1) -> true
    +
    +
    isNumber('1') // false
    +isNumber(1) // true
     

    isString

    Checks if the given argument is a string.

    Use typeof to check if a value is classified as a string primitive.

    const isString = val => typeof val === 'string';
    -// isString(10) -> false
    -// isString('10') -> true
    +
    +
    isString(10) // false
    +isString('10') // true
     

    isSymbol

    Checks if the given argument is a symbol.

    Use typeof to check if a value is classified as a symbol primitive.

    const isSymbol = val => typeof val === 'symbol';
    -// isSymbol('x') -> false
    -// isSymbol(Symbol('x')) -> true
    +
    +
    isSymbol('x') // false
    +isSymbol(Symbol('x')) // true
     

    randomHexColor

    Generates a random hexadecimal color code.

    @@ -1472,15 +1581,17 @@ Omit the second argument to use the default regex.

    return '#' + (n.length !== 6 ? (Math.random() * 0xf | 0).toString(16) + n : n); }; -// randomHexColorCode() -> "#e34155" -// randomHexColorCode() -> "#fd73a6" -// randomHexColorCode() -> "#4144c6" + +
    randomHexColorCode() // "#e34155"
    +randomHexColorCode() // "#fd73a6"
    +randomHexColorCode() // "#4144c6"
     

    RGBToHex

    Converts the values of RGB components to a color code.

    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'
    +
    +
    RGBToHex(255, 165, 1) // 'ffa501'
     

    timeTaken

    Measures the time taken by a function to execute.

    @@ -1489,13 +1600,15 @@ Omit the second argument to use the default regex.

    console.time('timeTaken'); const r = callback(); console.timeEnd('timeTaken'); return r; }; -// timeTaken(() => Math.pow(2, 10)) -> 1024 -// (logged): timeTaken: 0.02099609375ms + +
    timeTaken(() => Math.pow(2, 10)) // 1024
    +(logged): timeTaken: 0.02099609375ms
     

    toDecimalMark

    Use toLocaleString() to convert a float-point arithmetic to the Decimal mark form. It makes a comma separated string from a number.

    -
    const toDecimalMark = num => num.toLocaleString('en-US');
    -// toDecimalMark(12305030388.9087) -> "12,305,030,388.9087"
    +
    const toDecimalMark = num => num.toLocaleString("en-US");
    +
    +
    toDecimalMark(12305030388.9087) // "12,305,030,388.9087"
     

    toOrdinalSuffix

    Adds an ordinal suffix to a number.

    @@ -1508,7 +1621,8 @@ If digit is found in teens pattern, use teens ordinal.

    tPattern = [11, 12, 13, 14, 15, 16, 17, 18, 19]; return oPattern.includes(digits[0]) && !tPattern.includes(digits[1]) ? int + ordinals[digits[0] - 1] : int + ordinals[3]; }; -// toOrdinalSuffix("123") -> "123rd" +
    +
    toOrdinalSuffix("123") // "123rd"
     

    UUIDGenerator

    Generates a UUID.

    @@ -1517,7 +1631,8 @@ If digit is found in teens pattern, use teens ordinal.

    ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) ); -// UUIDGenerator() -> '7982fcfe-5721-4632-bede-6000885be57d' + +
    UUIDGenerator() // '7982fcfe-5721-4632-bede-6000885be57d'
     

    validateNumber

    Returns true if the given value is a number, false otherwise.

    @@ -1525,7 +1640,8 @@ If digit is found in teens pattern, use teens ordinal.

    Use isFinite() to check if the number is finite. Use Number() to check if the coercion holds.

    const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n;
    -// validateNumber('10') -> true
    +
    +
    validateNumber('10') // true