1. 数组

arrayMax

返回数组中的最大值。

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

chunk

将数组块划分为指定大小的较小数组

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

difference

返回两个数组之间的差异。集合a-b,即集合a中不在b中的元素。

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

distinctValuesOfArray

返回数组的所有不同值。

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

initializeArrayWithRange

初始化包含指定范围内的数字的数组。range(0, end+1)

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

initializeArrayWithValues

初始化并填充具有指定值的数组。

  1. const initializeArrayWithValues = (n, value = 0) => Array(n).fill(value);
  2. // initializeArrayWithValues(5, 2) -> [2,2,2,2,2]

shuffle

随机数组值的顺序。

  1. const shuffle = arr => arr.sort(() => Math.random() - 0.5);
  2. // shuffle([1,2,3]) -> [2,3,1]

symmetricDifference

返回两个数组之间的对称差。

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

union

返回在两个数组中的任意一个中存在的每个元素(并集)。

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

2. 数学

arrayAverage

返回数字数组的平均值。主要是熟练使用reduce。

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

3. 字符串

Capitalize

将字符串的第一个字母大写。大小写变换和[first, …rest]作为输入

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

sortCharactersInString

按字母顺序对字符串中的字符进行排序。字符排序String.localeCompare.

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

toCamelCase

将字符串转换为匹配。String.replace的用法(没太看懂).

  1. const toCamelCase = str =>
  2. str.replace(/^([A-Z])|[\s-_]+(\w)/g, (match, p1, p2, offset) => p2 ? p2.toUpperCase() : p1.toLowerCase());
  3. // toCamelCase("some_database_field_name") -> 'someDatabaseFieldName'
  4. // toCamelCase("Some label that needs to be camelized") -> 'someLabelThatNeedsToBeCamelized'
  5. // toCamelCase("some-javascript-property") -> 'someJavascriptProperty'
  6. // toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") -> 'someMixedStringWithSpacesUnderscoresAndHyphens'

4. 实用技巧

timeTaken

测量执行函数所用的时间。
使用console.time()和console.timeEnd()来测量开始和结束时间之间的差异, 以确定回调执行所用的时间

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

UUIDGenerator

生成 UUID。
使用cryptoAPI 生成 UUID, 符合RFC4122版本4。

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

validateEmail

如果给定的字符串是有效的电子邮件, 则返回true, 否则为false。
使用正则表达式检查电子邮件是否有效。如果电子邮件有效, 则返回 true, 如果没有, 则返回false。

  1. const validateEmail = str =>
  2. /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(str);
  3. // validateEmail(mymail@gmail.com) -> true

validateNumber

如果给定值为数字, 则返回true, 否则为false。
将!isNaN与parseFloat()结合使用, 以检查参数是否为数字。使用isFinite()检查数字是否是有限的。使用Number()检查强制是否保持。

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