This commit is contained in:
Angelos Chalaris
2017-12-19 13:32:25 +02:00
parent 0e5beb8310
commit ce9963f898
3 changed files with 189 additions and 25 deletions

121
README.md
View File

@ -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'
```