diff --git a/README.md b/README.md index 1809f3b5b..56e348fe0 100644 --- a/README.md +++ b/README.md @@ -186,7 +186,7 @@ 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); /* Promise.resolve( [ 1, 2, 3 ] ).then( call('map', x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ] const map = call.bind(null, 'map') @@ -203,7 +203,7 @@ 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); /* const Pall = collectInto( Promise.all.bind(Promise) ) let p1 = Promise.resolve(1) @@ -222,7 +222,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); /* let a = {name: 'John Smith'} let b = {} @@ -302,10 +302,10 @@ 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 arrayGcd = arr => { const gcd = (x, y) => !y ? x : gcd(y, x % y); - return arr.reduce((a,b) => gcd(a,b)); -} + return arr.reduce((a, b) => gcd(a, b)); +}; // arrayGcd([1,2,3,4,5]) -> 1 // arrayGcd([4,8,12]) -> 4 ``` @@ -319,11 +319,11 @@ 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 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)); -} + 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 ``` @@ -433,7 +433,7 @@ 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))) +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] ``` @@ -477,9 +477,9 @@ 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) -> [] +// dropRight([1,2,3]) -> [1,2] +// dropRight([1,2,3], 2) -> [1] +// dropRight([1,2,3], 42) -> [] ``` [⬆ back to top](#table-of-contents) @@ -517,7 +517,7 @@ 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 ); +const flatten = arr => [ ].concat(...arr); // flatten([1,[2],3,4]) -> [1,2,3,4] ``` @@ -605,7 +605,7 @@ 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] @@ -660,8 +660,8 @@ 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) => - (a => (a = [arr, arr.map(fn)], a[0].reduce( (acc,val,ind) => (acc[val] = a[1][ind], acc), {}) )) ( ); +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) squareIt([1,2,3]) // { 1: 1, 2: 4, 3: 9 } @@ -679,7 +679,7 @@ 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]; +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' ``` @@ -713,7 +713,7 @@ _(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)); }; @@ -740,11 +740,11 @@ 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)) - arr.length = 0; + .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]); @@ -765,13 +765,13 @@ 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; -} +}; /* let myArray = ['a', 'b', 'c', 'd']; let pulled = pullAtValue(myArray, ['b', 'd']); @@ -793,7 +793,7 @@ The `func` is invoked with three arguments (`value, index, array`). const remove = (arr, func) => Array.isArray(arr) ? arr.filter(func).reduce((acc, val) => { arr.splice(arr.indexOf(val), 1); return acc.concat(val); - }, []) + }, []) : []; // remove([1, 2, 3, 4], n => n % 2 == 0) -> [2, 4] ``` @@ -859,7 +859,7 @@ 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] ``` @@ -947,11 +947,11 @@ 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]); + }); +}; +// 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,7 +963,7 @@ 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 ), {} ) +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} ``` @@ -978,7 +978,7 @@ 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}
  • `); +const arrayToHtmlList = (arr, listID) => arr.map(item => document.querySelector('#' + listID).innerHTML += `
  • ${item}
  • `); // arrayToHtmlList(['item 1', 'item 2'],'myListID') ``` @@ -1018,7 +1018,7 @@ 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"; +const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? 'Mobile' : 'Desktop'; // detectDeviceType() -> "Mobile" // detectDeviceType() -> "Desktop" ``` @@ -1091,8 +1091,8 @@ Use `location.protocol` to get the protocol currently being used. If it's not HT ```js const httpsRedirect = () => { - if(location.protocol !== "https:") location.replace("https://" + location.href.split("//")[1]); -} + if (location.protocol !== 'https:') location.replace('https://' + location.href.split('//')[1]); +}; ``` [⬆ back to top](#table-of-contents) @@ -1155,7 +1155,7 @@ 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() }` + return `${dt.getDate()}/${dt.getMonth() + 1}/${dt.getFullYear()}`; }; // JSONToDate(/Date(1489525200000)/) -> "14/3/2017" ``` @@ -1170,8 +1170,7 @@ 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){return}}; +const toEnglishDate = (time) => { try { return new Date(time).toISOString().split('T')[0].replace(/-/g, '/'); } catch (e) {} }; // toEnglishDate('09/21/2010') -> '21/09/2010' ``` @@ -1346,9 +1345,9 @@ 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) -} + if (lower > upper) upper = [lower, lower = upper][0]; + 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 @@ -1378,7 +1377,7 @@ 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)); +const digitize = n => [...'' + n].map(i => parseInt(i)); // digitize(2334) -> [2, 3, 3, 4] ``` @@ -1408,7 +1407,7 @@ Throws an exception if `n` is a negative number. ```js const factorial = n => - n < 0 ? (() => { throw new TypeError('Negative numbers are not allowed!') })() + n < 0 ? (() => { throw new TypeError('Negative numbers are not allowed!'); })() : n <= 1 ? 1 : n * factorial(n - 1); // factorial(6) -> 720 ``` @@ -1438,7 +1437,7 @@ 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)); + Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2)); // fibonacciCountUntilNum(10) -> 7 ``` @@ -1454,9 +1453,9 @@ 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)); + 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] ``` @@ -1500,10 +1499,10 @@ 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 { + 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 @@ -1519,8 +1518,8 @@ 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( '' ) ); +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 @@ -1582,9 +1581,9 @@ Use the greatest common divisor (GCD) formula and `Math.abs()` to determine the The GCD formula uses recursion. ```js -const lcm = (x,y) => { +const lcm = (x, y) => { const gcd = (x, y) => !y ? x : gcd(y, x % y); - return Math.abs(x*y)/(gcd(x,y)); + return Math.abs(x * y) / (gcd(x, y)); }; // lcm(12,7) -> 84 ``` @@ -1662,13 +1661,13 @@ 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))); - return arr; -} -// primes(10) -> [2,3,5,7] + 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] ``` [⬆ back to top](#table-of-contents) @@ -1707,7 +1706,7 @@ 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}`); +const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`); // round(1.005, 2) -> 1.01 ``` @@ -1784,7 +1783,7 @@ 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)) +const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2)); // JSONToFile({test: "is passed"}, 'testJsonFile') -> writes the object to 'testJsonFile.json' ``` @@ -1830,9 +1829,9 @@ 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}} @@ -1970,7 +1969,7 @@ Use destructuring and `toUpperCase()` to capitalize first letter, `...rest` to g 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) => +const capitalize = ([first, ...rest], lowerRest = false) => first.toUpperCase() + (lowerRest ? rest.join('').toLowerCase() : rest.join('')); // capitalize('myName') -> 'MyName' // capitalize('myName', true) -> 'Myname' @@ -2043,9 +2042,9 @@ 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; -} +const repeatString = (str = '', num = 2) => { + return num >= 0 ? str.repeat(num) : str; +}; // repeatString("abc",3) -> 'abcabcabc' // repeatString("abc") -> 'abcabc' ``` @@ -2090,10 +2089,10 @@ For more detailed explanation of this Regex, [visit this Site](https://regex101. ```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()) + .map(x => x.slice(0, 1).toUpperCase() + x.slice(1).toLowerCase()) .join(''); - return s.slice(0,1).toLowerCase() + s.slice(1) - } + 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' @@ -2131,11 +2130,11 @@ 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 =>{ +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' @@ -2184,7 +2183,7 @@ 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(_)) +const coalesce = (...args) => args.find(_ => ![undefined, null].includes(_)); // coalesce(null,undefined,"",NaN, "Waldo") -> "" ``` @@ -2212,7 +2211,7 @@ 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('') + '#' + shortHex.slice(shortHex.startsWith('#') ? 1 : 0).split('').map(x => x + x).join(''); // extendHex('#03f') -> '#0033ff' // extendHex('05a') -> '#0055aa' ``` @@ -2245,16 +2244,15 @@ const hexToRGB = hex => { 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)}` : '') + ')'; + 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)}` : '') + ')'; }; // 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) @@ -2351,10 +2349,10 @@ Use `Math.random` to generate a random 24-bit(6x4bits) hexadecimal number. Use b ```js const randomHexColor = () => { - let n = (Math.random()*0xfffff|0).toString(16); - return '#' + (n.length !== 6 - ? (Math.random()*0xf|0).toString(16) + n : n); -} + 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" @@ -2383,8 +2381,8 @@ Use `console.time()` and `console.timeEnd()` to measure the difference between t ```js const timeTaken = callback => { - console.time('timeTaken'); const r = callback(); - console.timeEnd('timeTaken'); return r; + console.time('timeTaken'); const r = callback(); + console.timeEnd('timeTaken'); return r; }; // timeTaken(() => Math.pow(2, 10)) -> 1024 // (logged): timeTaken: 0.02099609375ms @@ -2397,7 +2395,7 @@ 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"); +const toDecimalMark = num => num.toLocaleString('en-US'); // toDecimalMark(12305030388.9087) -> "12,305,030,388.9087" ``` diff --git a/docs/index.html b/docs/index.html index 937f4c803..2ef4632c4 100644 --- a/docs/index.html +++ b/docs/index.html @@ -242,7 +242,7 @@

    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 );
    +
    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')
    @@ -252,7 +252,7 @@ Promise.resolve( [ 1, 2, 3 ] ).then( map( x => 2 * x ) ).then( console.log )
     

    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 collectInto = fn => (...args) => fn(args);
     /*
     const Pall = collectInto( Promise.all.bind(Promise) )
     let p1 = Promise.resolve(1)
    @@ -264,7 +264,7 @@ 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)
    +
    const flip = fn => (...args) => fn(args.pop(), ...args);
     /*
     let a = {name: 'John Smith'}
     let b = {}
    @@ -315,21 +315,21 @@ arrayMax([1,2,4]) // -> 4
     

    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.

    -
    const arrayGcd = arr =>{
    +
    const arrayGcd = arr => {
       const gcd = (x, y) => !y ? x : gcd(y, x % y);
    -  return arr.reduce((a,b) => gcd(a,b));
    -}
    +  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 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));
    -}
    +  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
     
    @@ -383,7 +383,7 @@ Recursively flatten each element that is an array.


    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)))
    +
    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

    @@ -406,9 +406,9 @@ Returns the remaining elements.

    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.

    @@ -425,7 +425,7 @@ Returns the remaining elements.


    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 );
    +
    const flatten = arr => [ ].concat(...arr);
     // flatten([1,[2],3,4]) -> [1,2,3,4]
     

    flattenDepth

    @@ -471,7 +471,7 @@ Use Array.reduce() to create an object, where the keys are produced

    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.

    -
    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]
    @@ -498,8 +498,8 @@ You can omit value to use a default value of 0.


    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 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)
     squareIt([1,2,3]) // { 1: 1, 2: 4, 3: 9 }
    @@ -510,7 +510,7 @@ squareIt([1,2,3]) // { 1: 1, 2: 4, 3: 9 }
     

    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];
    +
    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'
     
    @@ -529,7 +529,7 @@ Use Array.length = 0 to mutate the passed in an array by resetting
    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));
     };
     
    @@ -549,11 +549,11 @@ 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))
    -  arr.length = 0; 
    +                  .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]);
    @@ -567,13 +567,13 @@ Use Array.push() to keep track of pulled values

    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

    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;
    -}
    +};
     /*
     let myArray = ['a', 'b', 'c', 'd'];
     let pulled = pullAtValue(myArray, ['b', 'd']);
    @@ -588,7 +588,7 @@ The func is invoked with three arguments (value, index, array
     
    const remove = (arr, func) =>
       Array.isArray(arr) ? arr.filter(func).reduce((acc, val) => {
         arr.splice(arr.indexOf(val), 1); return acc.concat(val);
    -    }, [])
    +  }, [])
       : [];
     // remove([1, 2, 3, 4], n => n % 2 == 0) -> [2, 4]
     
    @@ -626,7 +626,7 @@ 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]
     

    tail

    @@ -671,16 +671,16 @@ 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 ), {} )
    +
    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}
     
    @@ -688,7 +688,7 @@ If lengths of the argument-arrays vary, undefined is used where no

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

    bottomVisible

    @@ -707,7 +707,7 @@ If lengths of the argument-arrays vary, undefined is used where no

    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";
    +
    const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? 'Mobile' : 'Desktop';
     // detectDeviceType() -> "Mobile"
     // detectDeviceType() -> "Desktop"
     
    @@ -752,8 +752,8 @@ Pass location.search as the argument to apply to the current

    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.

    const httpsRedirect = () => {
    -  if(location.protocol !== "https:") location.replace("https://" + location.href.split("//")[1]);
    -}
    +  if (location.protocol !== 'https:') location.replace('https://' + location.href.split('//')[1]);
    +};
     

    redirect

    Redirects to a specified URL.

    @@ -788,7 +788,7 @@ Scroll by a fraction of the distance from the top. Use window.requestAnima

    Use Date(), to convert dates in JSON format to readable format (dd/mm/yyyy).

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

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

    tomorrow

    @@ -896,9 +895,9 @@ async function sleepyWork() { If num falls within the range, return num. Otherwise, return the nearest number in the range.

    const clampNumber = (num, lower, upper) => {
    -  if(lower > upper) upper = [lower, lower = upper][0];
    -  return (num>=lower && num<=upper) ? num : ((num < lower) ? lower : upper) 
    -}
    +  if (lower > upper) upper = [lower, lower = upper][0];
    +  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
    @@ -914,7 +913,7 @@ Otherwise, return the nearest number in the range.

    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));
    +
    const digitize = n => [...'' + n].map(i => parseInt(i));
     // digitize(2334) -> [2, 3, 3, 4]
     

    distance

    @@ -930,7 +929,7 @@ 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.

    const factorial = n =>
    -  n < 0 ? (() => { throw new TypeError('Negative numbers are not allowed!') })()
    +  n < 0 ? (() => { throw new TypeError('Negative numbers are not allowed!'); })()
       : n <= 1 ? 1 : n * factorial(n - 1);
     // factorial(6) -> 720
     
    @@ -946,7 +945,7 @@ Use Array.reduce() to add values into the array, using the sum of t

    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));
    +  Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2));
     // fibonacciCountUntilNum(10) -> 7
     

    fibonacciUntilNum

    @@ -955,9 +954,9 @@ Use Array.reduce() to add values into the array, using the sum of t 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.

    const fibonacciUntilNum = num => {
    -  let n = Math.ceil(Math.log(num * Math.sqrt(5) + 1/2) / Math.log((Math.sqrt(5)+1)/2));
    +  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]
     

    gcd

    @@ -980,10 +979,10 @@ Count and return the number of 1s in the string, using match(

    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);
    -}
    +
    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
    @@ -992,8 +991,8 @@ If the second parameter, end, is not specified, the range is consid
     

    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 ? true : false )( ( digits+'' ).split( '' ) );
    +
    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
    @@ -1027,9 +1026,9 @@ Return false if any of them divides the given number, else return <
     

    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.

    -
    const lcm = (x,y) => {
    +
    const lcm = (x, y) => {
       const gcd = (x, y) => !y ? x : gcd(y, x % y);
    -  return Math.abs(x*y)/(gcd(x,y));
    +  return Math.abs(x * y) / (gcd(x, y));
     };
     // lcm(12,7) -> 84
     
    @@ -1072,13 +1071,13 @@ Then, split('') into individual characters, reverse(),

    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)));
    -  return arr; 
    -}
    -// primes(10) -> [2,3,5,7] 
    +  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]
     

    randomIntegerInRange

    Returns a random integer in the specified range.

    @@ -1096,7 +1095,7 @@ Then, split('') into individual characters, reverse(),

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

    sdbmHashAlgorithm

    @@ -1144,7 +1143,7 @@ Use window.speechSynthesis.speak() to play the message.

    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))
    +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

    @@ -1176,9 +1175,9 @@ Also if you give it a special key (childIndicator) it will search d } 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}} @@ -1260,7 +1259,7 @@ Base cases are for string length equal to 2 or 1

    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.

    -
    const capitalize = ([first,...rest], lowerRest = false) =>
    +
    const capitalize = ([first, ...rest], lowerRest = false) =>
       first.toUpperCase() + (lowerRest ? rest.join('').toLowerCase() : rest.join(''));
     // capitalize('myName') -> 'MyName'
     // capitalize('myName', true) -> 'Myname'
    @@ -1298,9 +1297,9 @@ Omit the second argument to use a default separator of _.


    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;
    -}
    +
    const repeatString = (str = '', num = 2) => {
    +  return num >= 0 ? str.repeat(num) : str;
    +};
     // repeatString("abc",3) -> 'abcabcabc'
     // repeatString("abc") -> 'abcabc'
     
    @@ -1324,10 +1323,10 @@ Combine characters to get a string using join('').

    For more detailed explanation of this Regex, visit this Site.

    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())
    +    .map(x => x.slice(0, 1).toUpperCase() + x.slice(1).toLowerCase())
         .join('');
    -  return s.slice(0,1).toLowerCase() + s.slice(1)
    -  }
    +  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'
    @@ -1351,11 +1350,11 @@ For more detailed explanation of this Regex, visit this Site.

    -
    const toSnakeCase = str =>{
    +
    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'
    @@ -1383,7 +1382,7 @@ Omit the second argument to use the default regex.

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

    coalesceFactory

    @@ -1398,7 +1397,7 @@ Omit the second argument to use the default regex.

    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('')
    +  '#' + shortHex.slice(shortHex.startsWith('#') ? 1 : 0).split('').map(x => x + x).join('');
     // extendHex('#03f') -> '#0033ff'
     // extendHex('05a') -> '#0055aa'
     
    @@ -1417,16 +1416,15 @@ Omit the second argument to use the default regex.

    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)}` : '') + ')'; + 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)}` : '') + ')'; }; // 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.

    @@ -1474,10 +1472,10 @@ Omit the second argument to use the default regex.

    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).

    const randomHexColor = () => {
    -    let n = (Math.random()*0xfffff|0).toString(16);
    -    return '#' + (n.length !== 6
    -        ? (Math.random()*0xf|0).toString(16) + n : n);
    -}
    +  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"
    @@ -1492,15 +1490,15 @@ Omit the second argument to use the default regex.

    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.

    const timeTaken = callback => {
    -  console.time('timeTaken');  const r = callback();
    -  console.timeEnd('timeTaken');  return r;
    +  console.time('timeTaken'); const r = callback();
    +  console.timeEnd('timeTaken'); return r;
     };
     // 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");
    +
    const toDecimalMark = num => num.toLocaleString('en-US');
     // toDecimalMark(12305030388.9087) -> "12,305,030,388.9087"
     

    toOrdinalSuffix