diff --git a/README.md b/README.md index c13cf2fad..2a7f9e566 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,10 @@ * [`countOccurrences`](#countoccurrences) * [`deepFlatten`](#deepflatten) * [`difference`](#difference) +* [`differenceWith`](#differencewith) * [`distinctValuesOfArray`](#distinctvaluesofarray) * [`dropElements`](#dropelements) +* [`dropRight`](#dropright) * [`everyNth`](#everynth) * [`filterNonUnique`](#filternonunique) * [`flatten`](#flatten) @@ -34,6 +36,8 @@ * [`nthElement`](#nthelement) * [`pick`](#pick) * [`pull`](#pull) +* [`pullAll`](#pullall) +* [`pullAtIndex`](#pullatindex) * [`remove`](#remove) * [`sample`](#sample) * [`shuffle`](#shuffle) @@ -103,6 +107,7 @@ * [`cleanObj`](#cleanobj) * [`objectFromPairs`](#objectfrompairs) * [`objectToPairs`](#objecttopairs) +* [`select`](#select) * [`shallowClone`](#shallowclone) * [`truthCheckCollection`](#truthcheckcollection) @@ -235,6 +240,19 @@ const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has [⬆ 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))) +// 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. @@ -265,6 +283,21 @@ const dropElements = (arr, func) => { [⬆ back to top](#table-of-contents) +### dropRight + +Returns a new array with `n` elements removed from the right + +Check if `n` is shorter than the given array and use `Array.slice()` to slice it accordingly or return an empty array. + +```js +const dropRight = (arr, n = 1) => n < arr.length ? arr.slice(0, arr.length - n) : [] +//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. @@ -367,15 +400,16 @@ const initial = arr => arr.slice(0, -1); ### initializeArrayWithRange -Initializes an array containing the numbers in the specified range. +Initializes an array containing the numbers in the specified range where `start` and `end` are inclusive. -Use `Array(end-start)` to create an array of the desired length, `Array.map()` to fill with the desired values in a range. +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 - start }).map((v, i) => i + start); -// initializeArrayWithRange(5) -> [0,1,2,3,4] +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] ``` [⬆ back to top](#table-of-contents) @@ -474,6 +508,8 @@ 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 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 pulled = arr.filter((v, i) => !args.includes(v)); @@ -486,6 +522,52 @@ const pull = (arr, ...args) => { [⬆ back to top](#table-of-contents) +### pullAll + +Mutates the original array to filter out the values specified (accepts an array of values). + +Use `Array.filter()` and `Array.includes()` to pull out the values that are not needed. +Use `Array.length = 0` to mutate the passed in array by resetting it's length to zero and `Array.push()` to re-populate it with only the pulled values. + +```js +const pullAll = (arr, pullArr) => { + let pulled = arr.filter((v, i) => !pullArr.includes(v)); + arr.length = 0; pulled.forEach(v => arr.push(v)); +} +// let myArray = ['a', 'b', 'c', 'a', 'b', 'c']; +// pullAll(myArray, ['a', 'c']); +// console.log(myArray) -> [ '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 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; +} + +// 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) + ### remove Removes elements from an array for which the given function returns `false`. @@ -621,6 +703,8 @@ 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)); // without([2, 1, 2, 3], 1, 2) -> [3] @@ -658,7 +742,7 @@ 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; + document.documentElement.clientHeight + window.scrollY >= (document.documentElement.scrollHeight || document.documentElement.clientHeight); // bottomVisible() -> true ``` @@ -1144,7 +1228,7 @@ Return the number at the midpoint if `length` is odd, otherwise the average of t ```js const median = arr => { - const mid = Math.floor(arr.length / 2), nums = arr.sort((a, b) => a - b); + 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 @@ -1373,6 +1457,22 @@ const objectToPairs = obj => Object.keys(obj).map(k => [k, obj[k]]); [⬆ back to top](#table-of-contents) +### select + +Retrieve a property that indicated by the selector from object. + +If property 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' +``` + +[⬆ back to top](#table-of-contents) + ### shallowClone Creates a shallow clone of an object. @@ -1460,8 +1560,7 @@ Retuns `number` of vowels in provided string. Use a regular expression to count number of vowels `(A, E, I, O, U)` in a `string`. ```js -const countVowels = str => - return (str.match(/[aeiou]/ig) || []).length; +const countVowels = str => (str.match(/[aeiou]/ig) || []).length; // countVowels('foobar') -> 3 // countVowels('gym') -> 0 ``` @@ -1503,11 +1602,11 @@ const fromCamelCase = (str, separator = '_') => Reverses a string. -Use array destructuring and `Array.reverse()` to reverse the order of the characters in the 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].reverse().join(''); +const reverseString = str => str.split('').reverse().join(''); // reverseString('foobar') -> 'raboof' ``` diff --git a/docs/index.html b/docs/index.html index d0c93846e..b57d6a3df 100644 --- a/docs/index.html +++ b/docs/index.html @@ -42,8 +42,10 @@ countOccurrences deepFlatten difference +differenceWith distinctValuesOfArray dropElements +dropRight everyNth filterNonUnique flatten @@ -59,6 +61,8 @@ nthElement pick pull +pullAll +pullAtIndex remove sample shuffle @@ -128,6 +132,7 @@ cleanObj objectFromPairs objectToPairs +select shallowClone truthCheckCollection @@ -210,6 +215,12 @@ Recursively flatten each element that is an array.
const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); };
// difference([1,2,3], [1,2,4]) -> [3]
+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]
+
Returns all the distinct values of an array.
Use ES6 Set and the ...rest operator to discard all duplicated values.
Removes elements in an array until the passed function returns true. Returns the remaining elements in the array.
Loop through the array, using Array.shift() to drop the first element of the array until the returned value from the function is true.
+
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.
const dropElements = (arr, func) => {
- while (arr.length > 0 && !func(arr[0])) arr.shift();
+ while (arr.length > 0 && !func(arr[0])) arr = arr.slice(1);
return arr;
};
// dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4]
+Returns a new array with n elements removed from the right
Check if n is shorter than the given array and use Array.slice() to slice it accordingly or return an empty array.
const dropRight = (arr, n = 1) => n < arr.length ? arr.slice(0, arr.length - n) : []
+//dropRight([1,2,3]) -> [1,2]
+//dropRight([1,2,3], 2) -> [1]
+//dropRight([1,2,3], 42) -> []
+
Returns every nth element in an array.
Use Array.filter() to create a new array that contains every nth element of a given array.
Array.reduce() to create an object, where the keys are produced
// initial([1,2,3]) -> [1,2]
Initializes an array containing the numbers in the specified range.
-Use Array(end-start) to create an array of the desired length, Array.map() to fill with the desired values in a range.
+
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) =>
- Array.from({ length: end - start }).map((v, i) => i + start);
-// initializeArrayWithRange(5) -> [0,1,2,3,4]
+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]
Initializes and fills an array with the specified values.
@@ -334,6 +354,7 @@ Omit the second argument,n, to get the first element of the array.
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 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)
const pull = (arr, ...args) => {
let pulled = arr.filter((v, i) => !args.includes(v));
arr.length = 0; pulled.forEach(v => arr.push(v));
@@ -342,6 +363,38 @@ Use Array.length = 0 to mutate the passed in array by resetting it'
// pull(myArray, 'a', 'c');
// console.log(myArray) -> [ 'b', 'b' ]
+Mutates the original array to filter out the values specified (accepts an array of values).
+Use Array.filter() and Array.includes() to pull out the values that are not needed.
+Use Array.length = 0 to mutate the passed in array by resetting it's length to zero and Array.push() to re-populate it with only the pulled values.
const pullAll = (arr, pullArr) => {
+ let pulled = arr.filter((v, i) => !pullArr.includes(v));
+ arr.length = 0; pulled.forEach(v => arr.push(v));
+}
+// let myArray = ['a', 'b', 'c', 'a', 'b', 'c'];
+// pullAll(myArray, ['a', 'c']);
+// console.log(myArray) -> [ 'b', 'b' ]
+
+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 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 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;
+}
+
+// let myArray = ['a', 'b', 'c', 'd'];
+// let pulled = pullAtIndex(myArray, [1, 3]);
+
+// console.log(myArray); -> [ 'a', 'c' ]
+// console.log(pulled); -> [ 'b', 'd' ]
+
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().
@@ -411,6 +464,7 @@ This method also works with strings.
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]
@@ -433,7 +487,7 @@ If lengths of the argument-arrays vary, undefined is used where no
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;
+ document.documentElement.clientHeight + window.scrollY >= (document.documentElement.scrollHeight || document.documentElement.clientHeight);
// bottomVisible() -> true
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.
const median = arr => {
- const mid = Math.floor(arr.length / 2), nums = arr.sort((a, b) => a - b);
+ 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
@@ -842,6 +896,15 @@ Also if you give it a special key (childIndicator) it will search d
const objectToPairs = obj => Object.keys(obj).map(k => [k, obj[k]]);
// objectToPairs({a: 1, b: 2}) -> [['a',1],['b',2]])
+Retrieve a property that indicated by the selector from object.
+If property 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'
+
Creates a shallow clone of an object.
Use Object.assign() and an empty object ({}) to create a shallow clone of the original.
lowerRest parameter to keep the rest of the string intact,
Retuns number of vowels in provided string.
Use a regular expression to count number of vowels (A, E, I, O, U) in a string.
const countVowels = str =>
- return (str.match(/[aeiou]/ig) || []).length;
+const countVowels = str => (str.match(/[aeiou]/ig) || []).length;
// countVowels('foobar') -> 3
// countVowels('gym') -> 0
@@ -914,9 +976,9 @@ Omit the second argument to use a default separator of _.
Reverses a string.
-Use array destructuring and Array.reverse() to reverse the order of the characters in the 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].reverse().join('');
+const reverseString = str => str.split('').reverse().join('');
// reverseString('foobar') -> 'raboof'