Format snippets
This commit is contained in:
@ -19,7 +19,10 @@ const CSVToJSON = (data, delimiter = ',') => {
|
||||
.split('\n')
|
||||
.map(v => {
|
||||
const values = v.split(delimiter);
|
||||
return titles.reduce((obj, title, index) => ((obj[title] = values[index]), obj), {});
|
||||
return titles.reduce(
|
||||
(obj, title, index) => ((obj[title] = values[index]), obj),
|
||||
{}
|
||||
);
|
||||
});
|
||||
};
|
||||
```
|
||||
|
||||
@ -16,10 +16,11 @@ const JSONtoCSV = (arr, columns, delimiter = ',') =>
|
||||
columns.join(delimiter),
|
||||
...arr.map(obj =>
|
||||
columns.reduce(
|
||||
(acc, key) => `${acc}${!acc.length ? '' : delimiter}"${!obj[key] ? '' : obj[key]}"`,
|
||||
(acc, key) =>
|
||||
`${acc}${!acc.length ? '' : delimiter}"${!obj[key] ? '' : obj[key]}"`,
|
||||
''
|
||||
)
|
||||
)
|
||||
),
|
||||
].join('\n');
|
||||
```
|
||||
|
||||
|
||||
@ -9,7 +9,8 @@ Creates an array of partial sums.
|
||||
- Use `Array.prototype.slice(-1)`, the spread operator (`...`) and the unary `+` operator to add each value to the accumulator array containing the previous sums.
|
||||
|
||||
```js
|
||||
const accumulate = (...nums) => nums.reduce((acc, n) => [...acc, n + +acc.slice(-1)],[]);
|
||||
const accumulate = (...nums) =>
|
||||
nums.reduce((acc, n) => [...acc, n + +acc.slice(-1)],[]);
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -9,8 +9,10 @@ Adds multiple event listeners with the same handler to an element.
|
||||
|
||||
```js
|
||||
const addMultipleListeners = (el, types, listener, options, useCapture) => {
|
||||
types.forEach(type => el.addEventListener(type, listener, options, useCapture));
|
||||
}
|
||||
types.forEach(type =>
|
||||
el.addEventListener(type, listener, options, useCapture)
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -11,15 +11,13 @@ Calculates the date after adding the ginen number of business days.
|
||||
- **NOTE:** Does not take official holidays into account.
|
||||
|
||||
```js
|
||||
const addWeekDays = (startDate, count) =>
|
||||
Array
|
||||
.from({ length: count })
|
||||
.reduce(date => {
|
||||
date = new Date(date.setDate(date.getDate() + 1));
|
||||
if (date.getDay() % 6 === 0)
|
||||
date = new Date(date.setDate(date.getDate() + ((date.getDay() / 6) + 1)));
|
||||
return date;
|
||||
}, startDate);
|
||||
const addWeekDays = (startDate, count) =>
|
||||
Array.from({ length: count }).reduce(date => {
|
||||
date = new Date(date.setDate(date.getDate() + 1));
|
||||
if (date.getDay() % 6 === 0)
|
||||
date = new Date(date.setDate(date.getDate() + (date.getDay() / 6 + 1)));
|
||||
return date;
|
||||
}, startDate);
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -9,7 +9,8 @@ Checks if two numbers are approximately equal to each other.
|
||||
- Omit the third parameter, `epsilon`, to use a default value of `0.001`.
|
||||
|
||||
```js
|
||||
const approximatelyEqual = (v1, v2, epsilon = 0.001) => Math.abs(v1 - v2) < epsilon;
|
||||
const approximatelyEqual = (v1, v2, epsilon = 0.001) =>
|
||||
Math.abs(v1 - v2) < epsilon;
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -9,7 +9,8 @@ Calculates the average of two or more numbers.
|
||||
- Divide the resulting array by its length.
|
||||
|
||||
```js
|
||||
const average = (...nums) => nums.reduce((acc, val) => acc + val, 0) / nums.length;
|
||||
const average = (...nums) =>
|
||||
nums.reduce((acc, val) => acc + val, 0) / nums.length;
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -10,7 +10,10 @@ Splits values into two groups, based on the result of the given `filter` array.
|
||||
|
||||
```js
|
||||
const bifurcate = (arr, filter) =>
|
||||
arr.reduce((acc, val, i) => (acc[filter[i] ? 0 : 1].push(val), acc), [[], []]);
|
||||
arr.reduce((acc, val, i) => (acc[filter[i] ? 0 : 1].push(val), acc), [
|
||||
[],
|
||||
[],
|
||||
]);
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -10,7 +10,10 @@ Splits values into two groups, based on the result of the given filtering functi
|
||||
|
||||
```js
|
||||
const bifurcateBy = (arr, fn) =>
|
||||
arr.reduce((acc, val, i) => (acc[fn(val, i) ? 0 : 1].push(val), acc), [[], []]);
|
||||
arr.reduce((acc, val, i) => (acc[fn(val, i) ? 0 : 1].push(val), acc), [
|
||||
[],
|
||||
[],
|
||||
]);
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -10,7 +10,8 @@ Checks if the bottom of the page is visible.
|
||||
```js
|
||||
const bottomVisible = () =>
|
||||
document.documentElement.clientHeight + window.scrollY >=
|
||||
(document.documentElement.scrollHeight || document.documentElement.clientHeight);
|
||||
(document.documentElement.scrollHeight ||
|
||||
document.documentElement.clientHeight);
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -11,7 +11,8 @@ Capitalizes the first letter of a string.
|
||||
|
||||
```js
|
||||
const capitalize = ([first, ...rest], lowerRest = false) =>
|
||||
first.toUpperCase() + (lowerRest ? rest.join('').toLowerCase() : rest.join(''));
|
||||
first.toUpperCase() +
|
||||
(lowerRest ? rest.join('').toLowerCase() : rest.join(''));
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -8,7 +8,8 @@ Capitalizes the first letter of every word in a string.
|
||||
- Use `String.prototype.replace()` to match the first character of each word and `String.prototype.toUpperCase()` to capitalize it.
|
||||
|
||||
```js
|
||||
const capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase());
|
||||
const capitalizeEveryWord = str =>
|
||||
str.replace(/\b[a-z]/g, char => char.toUpperCase());
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -9,7 +9,8 @@ Clamps `num` within the inclusive range specified by the boundary values `a` and
|
||||
- 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));
|
||||
const clampNumber = (num, a, b) =>
|
||||
Math.max(Math.min(num, Math.max(a, b)), Math.min(a, b));
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
---
|
||||
title: cloneRegExp
|
||||
tags: regexp,intermediate
|
||||
tags: type,intermediate
|
||||
---
|
||||
|
||||
Clones a regular expression.
|
||||
|
||||
@ -12,6 +12,8 @@ const coalesceFactory = valid => (...args) => args.find(valid);
|
||||
```
|
||||
|
||||
```js
|
||||
const customCoalesce = coalesceFactory(v => ![null, undefined, '', NaN].includes(v));
|
||||
const customCoalesce = coalesceFactory(
|
||||
v => ![null, undefined, '', NaN].includes(v)
|
||||
);
|
||||
customCoalesce(undefined, null, NaN, '', 'Waldo'); // 'Waldo'
|
||||
```
|
||||
|
||||
@ -32,5 +32,6 @@ const colorize = (...args) => ({
|
||||
```js
|
||||
console.log(colorize('foo').red); // 'foo' (red letters)
|
||||
console.log(colorize('foo', 'bar').bgBlue); // 'foo bar' (blue background)
|
||||
console.log(colorize(colorize('foo').yellow, colorize('foo').green).bgWhite); // 'foo bar' (first word in yellow letters, second word in green letters, white background for both)
|
||||
console.log(colorize(colorize('foo').yellow, colorize('foo').green).bgWhite);
|
||||
// 'foo bar' (first word in yellow letters, second word in green letters, white background for both)
|
||||
```
|
||||
|
||||
@ -12,5 +12,6 @@ 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 ]
|
||||
```
|
||||
|
||||
@ -9,7 +9,8 @@ Performs 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)));
|
||||
const compose = (...fns) =>
|
||||
fns.reduce((f, g) => (...args) => f(g(...args)));
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -9,7 +9,8 @@ Performs left-to-right function composition.
|
||||
- The first (leftmost) function can accept one or more arguments; the remaining functions must be unary.
|
||||
|
||||
```js
|
||||
const composeRight = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args)));
|
||||
const composeRight = (...fns) =>
|
||||
fns.reduce((f, g) => (...args) => g(f(...args)));
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -22,7 +22,9 @@ const copyToClipboard = str => {
|
||||
el.style.left = '-9999px';
|
||||
document.body.appendChild(el);
|
||||
const selected =
|
||||
document.getSelection().rangeCount > 0 ? document.getSelection().getRangeAt(0) : false;
|
||||
document.getSelection().rangeCount > 0
|
||||
? document.getSelection().getRangeAt(0)
|
||||
: false;
|
||||
el.select();
|
||||
document.execCommand('copy');
|
||||
document.body.removeChild(el);
|
||||
|
||||
@ -26,5 +26,6 @@ const counter = (selector, start, end, step = 1, duration = 2000) => {
|
||||
```
|
||||
|
||||
```js
|
||||
counter('#my-id', 1, 1000, 5, 2000); // Creates a 2-second timer for the element with id="my-id"
|
||||
counter('#my-id', 1, 1000, 5, 2000);
|
||||
// Creates a 2-second timer for the element with id="my-id"
|
||||
```
|
||||
|
||||
@ -14,5 +14,6 @@ const createDirIfNotExists = dir => (!fs.existsSync(dir) ? fs.mkdirSync(dir) : u
|
||||
```
|
||||
|
||||
```js
|
||||
createDirIfNotExists('test'); // creates the directory 'test', if it doesn't exist
|
||||
createDirIfNotExists('test');
|
||||
// creates the directory 'test', if it doesn't exist
|
||||
```
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
---
|
||||
title: curry
|
||||
tags: function,recursion,intermediate
|
||||
tags: function,recursion,advanced
|
||||
---
|
||||
|
||||
Curries a function.
|
||||
|
||||
@ -9,7 +9,8 @@ Gets the name of the weekday from a `Date` object.
|
||||
- Use the optional second parameter to get a language-specific name or omit it to use the default locale.
|
||||
|
||||
```js
|
||||
const dayName = (date, locale) => date.toLocaleDateString(locale, { weekday: 'long' });
|
||||
const dayName = (date, locale) =>
|
||||
date.toLocaleDateString(locale, { weekday: 'long' });
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -10,7 +10,8 @@ Decapitalizes the first letter of a string.
|
||||
|
||||
```js
|
||||
const decapitalize = ([first, ...rest], upperRest = false) =>
|
||||
first.toLowerCase() + (upperRest ? rest.join('').toUpperCase() : rest.join(''));
|
||||
first.toLowerCase() +
|
||||
(upperRest ? rest.join('').toUpperCase() : rest.join(''));
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -17,7 +17,9 @@ const deepClone = obj => {
|
||||
if (obj === null) return null;
|
||||
let clone = Object.assign({}, obj);
|
||||
Object.keys(clone).forEach(
|
||||
key => (clone[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key])
|
||||
key =>
|
||||
(clone[key] =
|
||||
typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key])
|
||||
);
|
||||
if (Array.isArray(obj)) {
|
||||
clone.length = obj.length;
|
||||
|
||||
@ -10,7 +10,8 @@ Deep flattens an array.
|
||||
- Recursively flatten each element that is an array.
|
||||
|
||||
```js
|
||||
const deepFlatten = arr => [].concat(...arr.map(v => (Array.isArray(v) ? deepFlatten(v) : v)));
|
||||
const deepFlatten = arr =>
|
||||
[].concat(...arr.map(v => (Array.isArray(v) ? deepFlatten(v) : v)));
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -10,7 +10,8 @@ Assigns default values for all properties in an object that are `undefined`.
|
||||
- Finally, use `obj` again to overwrite properties that originally had a value.
|
||||
|
||||
```js
|
||||
const defaults = (obj, ...defs) => Object.assign({}, obj, ...defs.reverse(), obj);
|
||||
const defaults = (obj, ...defs) =>
|
||||
Object.assign({}, obj, ...defs.reverse(), obj);
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -18,6 +18,8 @@ defer(console.log, 'a'), console.log('b'); // logs 'b' then 'a'
|
||||
|
||||
// Example B:
|
||||
document.querySelector('#someElement').innerHTML = 'Hello';
|
||||
longRunningFunction(); // Browser will not update the HTML until this has finished
|
||||
defer(longRunningFunction); // Browser will update the HTML then run the function
|
||||
longRunningFunction();
|
||||
// Browser will not update the HTML until this has finished
|
||||
defer(longRunningFunction);
|
||||
// Browser will update the HTML then run the function
|
||||
```
|
||||
|
||||
@ -9,7 +9,9 @@ Detects whether the page is being viewed on a mobile device or a desktop.
|
||||
|
||||
```js
|
||||
const detectDeviceType = () =>
|
||||
/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
|
||||
/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
|
||||
navigator.userAgent
|
||||
)
|
||||
? 'Mobile'
|
||||
: 'Desktop';
|
||||
```
|
||||
|
||||
@ -14,6 +14,10 @@ const differenceWith = (arr, val, comp = (a, b) => a === b) =>
|
||||
```
|
||||
|
||||
```js
|
||||
differenceWith([1, 1.2, 1.5, 3, 0], [1.9, 3, 0], (a, b) => Math.round(a) === Math.round(b)); // [1, 1.2]
|
||||
differenceWith(
|
||||
[1, 1.2, 1.5, 3, 0],
|
||||
[1.9, 3, 0],
|
||||
(a, b) => Math.round(a) === Math.round(b)
|
||||
); // [1, 1.2]
|
||||
differenceWith([1, 1.2, 1.3], [1, 1.3, 1.5]); // [1.2]
|
||||
```
|
||||
|
||||
@ -3,7 +3,7 @@ title: drop
|
||||
tags: array,beginner
|
||||
---
|
||||
|
||||
Returns a new array with `n` elements removed from the left.
|
||||
Creates a new array with `n` elements removed from the left.
|
||||
|
||||
- Use `Array.prototype.slice()` to remove the specified number of elements from the left.
|
||||
|
||||
@ -12,7 +12,7 @@ const drop = (arr, n = 1) => arr.slice(n);
|
||||
```
|
||||
|
||||
```js
|
||||
drop([1, 2, 3]); // [2,3]
|
||||
drop([1, 2, 3]); // [2, 3]
|
||||
drop([1, 2, 3], 2); // [3]
|
||||
drop([1, 2, 3], 42); // []
|
||||
```
|
||||
```
|
||||
|
||||
@ -3,7 +3,7 @@ title: dropRight
|
||||
tags: array,beginner
|
||||
---
|
||||
|
||||
Returns a new array with `n` elements removed from the right.
|
||||
Creates a new array with `n` elements removed from the right.
|
||||
|
||||
- Use `Array.prototype.slice()` to remove the specified number of elements from the right.
|
||||
|
||||
|
||||
@ -9,10 +9,13 @@ Checks if the `parent` element contains the `child` element.
|
||||
- Use `Node.contains()` to check if the `parent` element contains the `child` element.
|
||||
|
||||
```js
|
||||
const elementContains = (parent, child) => parent !== child && parent.contains(child);
|
||||
const elementContains = (parent, child) =>
|
||||
parent !== child && parent.contains(child);
|
||||
```
|
||||
|
||||
```js
|
||||
elementContains(document.querySelector('head'), document.querySelector('title')); // true
|
||||
elementContains(document.querySelector('body'), document.querySelector('body')); // false
|
||||
elementContains(document.querySelector('head'), document.querySelector('title'));
|
||||
// true
|
||||
elementContains(document.querySelector('body'), document.querySelector('body'));
|
||||
// false
|
||||
```
|
||||
|
||||
@ -13,7 +13,8 @@ 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)) &&
|
||||
? ((top > 0 && top < innerHeight) ||
|
||||
(bottom > 0 && bottom < innerHeight)) &&
|
||||
((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth))
|
||||
: top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth;
|
||||
};
|
||||
|
||||
@ -13,8 +13,10 @@ Performs a deep comparison between two values to determine if they are equivalen
|
||||
```js
|
||||
const equals = (a, b) => {
|
||||
if (a === b) return true;
|
||||
if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();
|
||||
if (!a || !b || (typeof a !== 'object' && typeof b !== 'object')) return a === b;
|
||||
if (a instanceof Date && b instanceof Date)
|
||||
return a.getTime() === b.getTime();
|
||||
if (!a || !b || (typeof a !== 'object' && typeof b !== 'object'))
|
||||
return a === b;
|
||||
if (a.prototype !== b.prototype) return false;
|
||||
let keys = Object.keys(a);
|
||||
if (keys.length !== Object.keys(b).length) return false;
|
||||
@ -23,6 +25,9 @@ const equals = (a, b) => {
|
||||
```
|
||||
|
||||
```js
|
||||
equals({ a: [2, { e: 3 }], b: [4], c: 'foo' }, { a: [2, { e: 3 }], b: [4], c: 'foo' }); // true
|
||||
equals(
|
||||
{ a: [2, { e: 3 }], b: [4], c: 'foo' },
|
||||
{ a: [2, { e: 3 }], b: [4], c: 'foo' }
|
||||
); // true
|
||||
equals([1, 2, 3], { 0: 1, 1: 2, 2: 3 }); // true
|
||||
```
|
||||
|
||||
@ -3,12 +3,13 @@ title: filterNonUnique
|
||||
tags: array,beginner
|
||||
---
|
||||
|
||||
Returns an array with the non-unique values filtered out.
|
||||
Creates an array with the non-unique values filtered out.
|
||||
|
||||
- Use `Array.prototype.filter()` to create an array containing only the unique values.
|
||||
|
||||
```js
|
||||
const filterNonUnique = arr => arr.filter(i => arr.indexOf(i) === arr.lastIndexOf(i));
|
||||
const filterNonUnique = arr =>
|
||||
arr.filter(i => arr.indexOf(i) === arr.lastIndexOf(i));
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -3,7 +3,7 @@ title: filterNonUniqueBy
|
||||
tags: array,intermediate
|
||||
---
|
||||
|
||||
Returns an array with the non-unique values filtered out, based on a provided comparator function.
|
||||
Creates an array with the non-unique values filtered out, based on a provided comparator function.
|
||||
|
||||
- Use `Array.prototype.filter()` and `Array.prototype.every()` to create an array containing only the unique values, based on the comparator function, `fn`.
|
||||
- The comparator function takes four arguments: the values of the two elements being compared and their indexes.
|
||||
|
||||
@ -3,14 +3,15 @@ title: findKey
|
||||
tags: object,intermediate
|
||||
---
|
||||
|
||||
Returns the first key that satisfies the provided testing function.
|
||||
Finds the first key that satisfies the provided testing function.
|
||||
Otherwise `undefined` is returned.
|
||||
|
||||
- Use `Object.keys(obj)` to get all the properties of the object, `Array.prototype.find()` to test each key-value pair using `fn`.
|
||||
- The callback receives three arguments - the value, the key and the object.
|
||||
|
||||
```js
|
||||
const findKey = (obj, fn) => Object.keys(obj).find(key => fn(obj[key], key, obj));
|
||||
const findKey = (obj, fn) =>
|
||||
Object.keys(obj).find(key => fn(obj[key], key, obj));
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -3,7 +3,7 @@ title: findLast
|
||||
tags: array,beginner
|
||||
---
|
||||
|
||||
Returns the last element for which the provided function returns a truthy value.
|
||||
Finds the last element for which the provided function returns a truthy value.
|
||||
|
||||
- Use `Array.prototype.filter()` to remove elements for which `fn` returns falsy values.
|
||||
- Use `Array.prototype.pop()` to get the last element in the filtered array.
|
||||
|
||||
@ -3,7 +3,7 @@ title: findLastIndex
|
||||
tags: array,intermediate
|
||||
---
|
||||
|
||||
Returns the index of the last element for which the provided function returns a truthy value.
|
||||
Finds the index of the last element for which the provided function returns a truthy value.
|
||||
|
||||
- Use `Array.prototype.map()` to map each element to an array with its index and value.
|
||||
- Use `Array.prototype.filter()` to remove elements for which `fn` returns falsy values
|
||||
|
||||
@ -3,7 +3,7 @@ title: findLastKey
|
||||
tags: object,intermediate
|
||||
---
|
||||
|
||||
Returns the last key that satisfies the provided testing function.
|
||||
Finds the last key that satisfies the provided testing function.
|
||||
Otherwise `undefined` is returned.
|
||||
|
||||
- Use `Object.keys(obj)` to get all the properties of the object.
|
||||
|
||||
@ -12,7 +12,11 @@ Flattens an array up to the specified depth.
|
||||
|
||||
```js
|
||||
const flatten = (arr, depth = 1) =>
|
||||
arr.reduce((a, v) => a.concat(depth > 1 && Array.isArray(v) ? flatten(v, depth - 1) : v), []);
|
||||
arr.reduce(
|
||||
(a, v) =>
|
||||
a.concat(depth > 1 && Array.isArray(v) ? flatten(v, depth - 1) : v),
|
||||
[]
|
||||
);
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -10,7 +10,8 @@ Iterates over all own properties of an object, running a callback for each one.
|
||||
- The callback receives three arguments - the value, the key and the object.
|
||||
|
||||
```js
|
||||
const forOwn = (obj, fn) => Object.keys(obj).forEach(key => fn(obj[key], key, obj));
|
||||
const forOwn = (obj, fn) =>
|
||||
Object.keys(obj).forEach(key => fn(obj[key], key, obj));
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -29,5 +29,6 @@ const formatDuration = ms => {
|
||||
|
||||
```js
|
||||
formatDuration(1001); // '1 second, 1 millisecond'
|
||||
formatDuration(34325055574); // '397 days, 6 hours, 44 minutes, 15 seconds, 574 milliseconds'
|
||||
formatDuration(34325055574);
|
||||
// '397 days, 6 hours, 44 minutes, 15 seconds, 574 milliseconds'
|
||||
```
|
||||
|
||||
@ -3,7 +3,7 @@ title: formatNumber
|
||||
tags: string,math,beginner
|
||||
---
|
||||
|
||||
Returns a number using the local number format order.
|
||||
Formats a number using the local number format order.
|
||||
|
||||
- Use `Number.prototype.toLocaleString()` to convert a number to using the local number format separators.
|
||||
|
||||
|
||||
@ -18,7 +18,8 @@ const fromCamelCase = (str, separator = '_') =>
|
||||
|
||||
```js
|
||||
fromCamelCase('someDatabaseFieldName', ' '); // 'some database field name'
|
||||
fromCamelCase('someLabelThatNeedsToBeDecamelized', '-'); // 'some-label-that-needs-to-be-decamelized'
|
||||
fromCamelCase('someLabelThatNeedsToBeDecamelized', '-');
|
||||
// 'some-label-that-needs-to-be-decamelized'
|
||||
fromCamelCase('someJavascriptProperty', '_'); // 'some_javascript_property'
|
||||
fromCamelCase('JSONToCSV', '.'); // 'json.to.csv'
|
||||
```
|
||||
|
||||
@ -13,5 +13,6 @@ const generateItems = (n, fn) => Array.from({ length: n }, (_, i) => fn(i));
|
||||
```
|
||||
|
||||
```js
|
||||
generateItems(10, Math.random); // [0.21, 0.08, 0.40, 0.96, 0.96, 0.24, 0.19, 0.96, 0.42, 0.70]
|
||||
generateItems(10, Math.random);
|
||||
// [0.21, 0.08, 0.40, 0.96, 0.96, 0.24, 0.19, 0.96, 0.42, 0.70]
|
||||
```
|
||||
|
||||
@ -12,9 +12,9 @@ Returns an error if `step` equals `1`.
|
||||
|
||||
```js
|
||||
const geometricProgression = (end, start = 1, step = 2) =>
|
||||
Array.from({ length: Math.floor(Math.log(end / start) / Math.log(step)) + 1 }).map(
|
||||
(_, i) => start * step ** i
|
||||
);
|
||||
Array.from({
|
||||
length: Math.floor(Math.log(end / start) / Math.log(step)) + 1,
|
||||
}).map((_, i) => start * step ** i);
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -13,5 +13,6 @@ const getBaseURL = url =>
|
||||
```
|
||||
|
||||
```js
|
||||
getBaseURL('http://url.com/page?name=Adam&surname=Smith'); // 'http://url.com/page'
|
||||
getBaseURL('http://url.com/page?name=Adam&surname=Smith');
|
||||
// 'http://url.com/page'
|
||||
```
|
||||
|
||||
@ -11,7 +11,9 @@ Returns an array of HTML elements whose width is larger than that of the viewpor
|
||||
```js
|
||||
const getElementsBiggerThanViewport = () => {
|
||||
const docWidth = document.documentElement.offsetWidth;
|
||||
return [...document.querySelectorAll('*')].filter(el => el.offsetWidth > docWidth);
|
||||
return [...document.querySelectorAll('*')].filter(
|
||||
el => el.offsetWidth > docWidth
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
|
||||
@ -12,7 +12,9 @@ Fetches all images from within an element and puts them into an array.
|
||||
|
||||
```js
|
||||
const getImages = (el, includeDuplicates = false) => {
|
||||
const images = [...el.getElementsByTagName('img')].map(img => img.getAttribute('src'));
|
||||
const images = [...el.getElementsByTagName('img')].map(img =>
|
||||
img.getAttribute('src')
|
||||
);
|
||||
return includeDuplicates ? images : [...new Set(images)];
|
||||
};
|
||||
```
|
||||
|
||||
@ -3,7 +3,7 @@ title: getURLParameters
|
||||
tags: browser,string,regexp,intermediate
|
||||
---
|
||||
|
||||
Returns an object containing the parameters of the current URL.
|
||||
Creates an object containing the parameters of the current URL.
|
||||
|
||||
- Use `String.prototype.match()` with an appropriate regular expression to get all key-value pairs.
|
||||
- Use `Array.prototype.reduce()` to map and combine them into a single object.
|
||||
@ -12,7 +12,9 @@ Returns an object containing the parameters of 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),
|
||||
(a, v) => (
|
||||
(a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1)), a
|
||||
),
|
||||
{}
|
||||
);
|
||||
```
|
||||
|
||||
@ -10,10 +10,12 @@ Groups the elements of an array based on the given function.
|
||||
|
||||
```js
|
||||
const groupBy = (arr, fn) =>
|
||||
arr.map(typeof fn === 'function' ? fn : val => val[fn]).reduce((acc, val, i) => {
|
||||
acc[val] = (acc[val] || []).concat(arr[i]);
|
||||
return acc;
|
||||
}, {});
|
||||
arr
|
||||
.map(typeof fn === 'function' ? fn : val => val[fn])
|
||||
.reduce((acc, val, i) => {
|
||||
acc[val] = (acc[val] || []).concat(arr[i]);
|
||||
return acc;
|
||||
}, {});
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -10,7 +10,9 @@ Checks if the current process's arguments contain the specified flags.
|
||||
|
||||
```js
|
||||
const hasFlags = (...flags) =>
|
||||
flags.every(flag => process.argv.includes(/^-{1,2}/.test(flag) ? flag : '--' + flag));
|
||||
flags.every(flag =>
|
||||
process.argv.includes(/^-{1,2}/.test(flag) ? flag : '--' + flag)
|
||||
);
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -14,13 +14,15 @@ Returns a promise.
|
||||
|
||||
```js
|
||||
const hashBrowser = val =>
|
||||
crypto.subtle.digest('SHA-256', new TextEncoder('utf-8').encode(val)).then(h => {
|
||||
let hexes = [],
|
||||
view = new DataView(h);
|
||||
for (let i = 0; i < view.byteLength; i += 4)
|
||||
hexes.push(('00000000' + view.getUint32(i).toString(16)).slice(-8));
|
||||
return hexes.join('');
|
||||
});
|
||||
crypto.subtle
|
||||
.digest('SHA-256', new TextEncoder('utf-8').encode(val))
|
||||
.then(h => {
|
||||
let hexes = [],
|
||||
view = new DataView(h);
|
||||
for (let i = 0; i < view.byteLength; i += 4)
|
||||
hexes.push(('00000000' + view.getUint32(i).toString(16)).slice(-8));
|
||||
return hexes.join('');
|
||||
});
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -12,7 +12,8 @@ Redirects the page to HTTPS if it's currently in HTTP.
|
||||
|
||||
```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]);
|
||||
};
|
||||
```
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@ title: indexOfAll
|
||||
tags: array,intermediate
|
||||
---
|
||||
|
||||
Returns all indexes of `val` in an array.
|
||||
Finds all indexes of `val` in an array.
|
||||
If `val` never occurs, returns an empty array.
|
||||
|
||||
- Use `Array.prototype.reduce()` to loop over elements and store indexes for matching elements.
|
||||
|
||||
@ -12,7 +12,10 @@ Initializes an array containing the numbers in the specified range where `start`
|
||||
|
||||
```js
|
||||
const initializeArrayWithRange = (end, start = 0, step = 1) =>
|
||||
Array.from({ length: Math.ceil((end - start + 1) / step) }, (_, i) => i * step + start);
|
||||
Array.from(
|
||||
{ length: Math.ceil((end - start + 1) / step) },
|
||||
(_, i) => i * step + start
|
||||
);
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -12,7 +12,9 @@ Create a n-dimensional array with given value.
|
||||
const initializeNDArray = (val, ...args) =>
|
||||
args.length === 0
|
||||
? val
|
||||
: Array.from({ length: args[0] }).map(() => initializeNDArray(val, ...args.slice(1)));
|
||||
: Array.from({ length: args[0] }).map(() =>
|
||||
initializeNDArray(val, ...args.slice(1))
|
||||
);
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -17,7 +17,7 @@ const injectCSS = css => {
|
||||
el.innerText = css;
|
||||
document.head.appendChild(el);
|
||||
return el;
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -13,7 +13,10 @@ Checks if the elements of the first array are contained in the second one regard
|
||||
```js
|
||||
const isContainedIn = (a, b) => {
|
||||
for (const v of new Set(a)) {
|
||||
if (!b.some(e => e === v) || a.filter(e => e === v).length > b.filter(e => e === v).length)
|
||||
if (
|
||||
!b.some(e => e === v) ||
|
||||
a.filter(e => e === v).length > b.filter(e => e === v).length
|
||||
)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
@ -3,7 +3,7 @@ title: isObject
|
||||
tags: type,object,beginner
|
||||
---
|
||||
|
||||
Returns a boolean determining if the passed value is an object or not.
|
||||
Checks if the passed value is an object or not.
|
||||
|
||||
- Uses the `Object` constructor to create an object wrapper for the given value.
|
||||
- If the value is `null` or `undefined`, create and return an empty object.
|
||||
|
||||
@ -3,7 +3,7 @@ title: isPrimitive
|
||||
tags: type,intermediate
|
||||
---
|
||||
|
||||
Returns a boolean determining if the passed value is primitive or not.
|
||||
Checks if the passed value is primitive or not.
|
||||
|
||||
- Create an object from `val` and compare it with `val` to determine if the passed value is primitive (i.e. not equal to the created object).
|
||||
|
||||
|
||||
@ -25,7 +25,7 @@ const join = (arr, separator = ',', end = separator) =>
|
||||
```
|
||||
|
||||
```js
|
||||
join(['pen', 'pineapple', 'apple', 'pen'], ',', '&'); // 'pen,pineapple,apple&pen'
|
||||
join(['pen', 'pineapple', 'apple', 'pen'],',','&'); // 'pen,pineapple,apple&pen'
|
||||
join(['pen', 'pineapple', 'apple', 'pen'], ','); // 'pen,pineapple,apple,pen'
|
||||
join(['pen', 'pineapple', 'apple', 'pen']); // 'pen,pineapple,apple,pen'
|
||||
```
|
||||
|
||||
@ -3,7 +3,7 @@ title: lcm
|
||||
tags: math,recursion,intermediate
|
||||
---
|
||||
|
||||
Returns the least common multiple of two or more numbers.
|
||||
Calculates the least common multiple of two or more numbers.
|
||||
|
||||
- Use the greatest common divisor (GCD) formula and the fact that `lcm(x,y) = x * y / gcd(x,y)` to determine the least common multiple.
|
||||
- The GCD formula uses recursion.
|
||||
|
||||
@ -9,7 +9,8 @@ Adds an event listener to an element that will only run the callback the first t
|
||||
- Use `{ once: true }` as options to only run the given callback once.
|
||||
|
||||
```js
|
||||
const listenOnce = (el, evt, fn) => el.addEventListener(evt, fn, { once: true });
|
||||
const listenOnce = (el, evt, fn) =>
|
||||
el.addEventListener(evt, fn, { once: true });
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -3,7 +3,7 @@ title: logBase
|
||||
tags: math,beginner
|
||||
---
|
||||
|
||||
Returns the logarithm of the given number in the given base.
|
||||
Calculates the logarithm of the given number in the given base.
|
||||
|
||||
- Use `Math.log()` to get the logarithm from the value and the base and divide them.
|
||||
|
||||
|
||||
@ -10,7 +10,8 @@ Takes any number of iterable objects or objects with a `length` property and ret
|
||||
- Returns `undefined` if no arguments are provided.
|
||||
|
||||
```js
|
||||
const longestItem = (...vals) => vals.reduce((a, x) => (x.length > a.length ? x : a));
|
||||
const longestItem = (...vals) =>
|
||||
vals.reduce((a, x) => (x.length > a.length ? x : a));
|
||||
```
|
||||
|
||||
```js
|
||||
|
||||
@ -3,7 +3,7 @@ title: median
|
||||
tags: math,array,intermediate
|
||||
---
|
||||
|
||||
Returns the median of an array of numbers.
|
||||
Calculates the median of an array of numbers.
|
||||
|
||||
- Find the middle of the array, use `Array.prototype.sort()` to sort the values.
|
||||
- Return the number at the midpoint if `Array.prototype.length` is odd, otherwise the average of the two middle numbers.
|
||||
|
||||
Reference in New Issue
Block a user