/30-seconds-of-code-zh-CN

精心收集的有用的 JavaScript 代码片段,可以让你在 30 秒或更少的时间内理解

Primary LanguageJavaScriptOtherNOASSERTION

Logo

30 seconds of code

精心收集的有用的 JavaScript 代码片段,可以让你在 30 秒或更少的时间内理解。

  • 使用 Ctrl + Fcommand + F 快速搜索
  • 欢迎贡献代码,再此之前请阅读 contribution guide.

目录

字符串换位组合(可重复)

比如字符串 "ab" 的所有换位组合字符串是 ["ab", "ba"]。而 "aab" 的所有换位组合是 ["aab", "aba", "aab", "aba", "baa", "baa"](允许重复)。

使用递归。

对于给定字符串中的每个字母,为其余字母创建所有的换位组合。使用 map() 把当前字母和其余字母的换位组合结合起来,然后用 reduce() 把所有换位组合放到一个数组里。递归结束条件是字符串的 length 属性等于 21

const anagrams = s => {
  if(s.length <= 2)  return s.length === 2 ? [s, s[1] + s[0]] : [s];
  return s.split('').reduce( (a,l,i) => {
    anagrams(s.slice(0,i) + s.slice(i+1)).map( v => a.push(l+v) );
    return a;
  }, []);
}

Average of array of numbers

Use reduce() to add each value to an accumulator, initialized with a value of 0, divide by the length of the array.

const average = arr =>
  arr.reduce( (acc , val) => acc + val, 0) / arr.length;

Capitalize first letter of every word

Use replace() to match the first character of each word and toUpperCase() to capitalize it.

const capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase());

Capitalize first letter

Use slice(0,1) and toUpperCase() to capitalize first letter, slice(1) to get the rest of the string. Omit the lowerRest parameter to keep the rest of the string intact, or set it to true to convert to lower case.

const capitalize = (str, lowerRest = false) =>
  str.slice(0, 1).toUpperCase() + (lowerRest? str.slice(1).toLowerCase() : str.slice(1));

Count occurrences of a value in array

Use reduce() to increment a counter each time you encounter the specific value inside the array.

const countOccurrences = (arr, value) => arr.reduce((a, v) => v===value ? a + 1 : a + 0, 0);

Current URL

Use window.location.href to get current URL.

const currentUrl = _ => window.location.href;

Curry

Use recursion. If the number of provided arguments (args) is sufficient, call the passed function f. Otherwise return a curried function f that expects the rest of the arguments.

const curry = f =>
  (...args) =>
    args.length >= f.length ? f(...args) : (...otherArgs) => curry(f)(...args, ...otherArgs)

Difference between arrays

Use filter() to remove values that are part of values, determined using includes().

const difference = (arr, values) => arr.filter(v => !values.includes(v));

Distance between two points

Use Math.hypot() to calculate the Euclidean distance between two points.

const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0);

Escape regular expression

Use replace() to escape special characters.

const escapeRegExp = s =>
  s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

Even or odd number

Use Math.abs() to extend logic to negative numbers, check using the modulo (%) operator. Return true if the number is even, false if the number is odd.

const isEven = num => Math.abs(num) % 2 === 0;

Factorial

Use recursion. If n is less than or equal to 1, return 1. Otherwise, return the product of n and the factorial of n - 1.

const factorial = n => n <= 1 ? 1 : n * factorial(n - 1)

Fibonacci array generator

Create an empty array of the specific length, initializing the first two values (0 and 1). Use reduce() to add values into the array, using the sum of the last two values, except for the first two.

const fibonacci = n =>
  Array.apply(null, [0,1].concat(Array(n-2))).reduce(
    (acc, val, i) => {
      acc.push( i>1 ? acc[i-1]+acc[i-2] : val);
      return acc;
    },[]);

Filter out non-unique values in an array

Use Array.filter() for an array containing only the unique values.

const unique = arr => arr.filter(i => arr.indexOf(i) === arr.lastIndexOf(i));
// unique([1,2,2,3,4,4,5]) -> [1,3,5]

Flatten array

Use recursion. Use reduce() to get all elements that are not arrays, flatten each element that is an array.

const flatten = arr =>
  arr.reduce( (a, v) => a.concat( Array.isArray(v) ? flatten(v) : v ), []);

et scroll position

Use pageXOffset and pageYOffset if they are defined, otherwise scrollLeft and scrollTop. You can omit el to use a default value of window.

const getScrollPos = (el = window) =>
  ( {x: (el.pageXOffset !== undefined) ? el.pageXOffset : el.scrollLeft,
   y: (el.pageYOffset !== undefined) ? el.pageYOffset : el.scrollTop} );
// getScrollPos() -> {x: 0, y: 200}

Greatest common divisor (GCD)

Use recursion. Base case is when y equals 0. In this case, return x. Otherwise, return the GCD of y and the remainder of the division x/y.

const gcd = (x , y) => !y ? x : gcd(y, x % y);

Head of list

Return arr[0].

const head = arr => arr[0];

Initial of list

Return arr.slice(0,-1).

const initial = arr => arr.slice(0,-1);

Initialize array with range

Use Array(end-start) to create an array of the desired length, map() to fill with the desired values in a range. You can omit start to use a default value of 0.

const initializeArrayRange = (end, start = 0) =>
  Array.apply(null, Array(end-start)).map( (v,i) => i + start );

Initialize array with values

Use Array(n) to create an array of the desired length, fill(v) to fill it with the desired values. You can omit v to use a default value of 0.

const initializeArray = (n, v = 0) =>
  Array(n).fill(v);

Last of list

Return arr.slice(-1)[0].

const last = arr => arr.slice(-1)[0];

Measure time taken by function

Use performance.now() to get start and end time for the function, console.log() the time taken. First argument is the function name, subsequent arguments are passed to the function.

const timeTaken = (f,...args) => {
  var t0 = performance.now(), r = f(...args);
  console.log(performance.now() - t0);
  return r;
}

Object from key-value pairs

Use map() to create objects for each key-value pair, combine with Object.assign().

const objectFromPairs = arr =>
  Object.assign(...arr.map( v => {return {[v[0]] : v[1]};} ));

Powerset

Use reduce() combined with map() to iterate over elements and combine into an array containing all combinations.

const powerset = arr =>
  arr.reduce( (a,v) => a.concat(a.map( r => [v].concat(r) )), [[]]);

Random number in range

Use Math.random() to generate a random value, map it to the desired range using multiplication.

const randomInRange = (min, max) => Math.random() * (max - min) + min;

Randomize order of array

Use sort() to reorder elements, utilizing Math.random() to randomize the sorting.

const randomizeOrder = arr => arr.sort( (a,b) => Math.random() >= 0.5 ? -1 : 1)

Redirect to URL

Use window.location.href or window.location.replace() to redirect to url. Pass a second argument to simulate a link click (true - default) or an HTTP redirect (false).

const redirect = (url, asLink = true) =>
  asLink ? window.location.href = url : window.location.replace(url);

Reverse a string

Use array destructuring 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('');

RGB to hexadecimal

Convert each value to a hexadecimal string, using toString(16), then padStart(2,'0') to get a 2-digit hexadecimal value. Combine values using join('').

const rgbToHex = (r, g, b) =>
  [r,g,b].map( v => v.toString(16).padStart(2,'0')).join('');

Scroll to top

Get distance from top using document.documentElement.scrollTop or document.body.scrollTop. Scroll by a fraction of the distance from top. Use window.requestAnimationFrame() to animate the scrolling.

const scrollToTop = _ => {
  const c = document.documentElement.scrollTop || document.body.scrollTop;
  if(c > 0) {
    window.requestAnimationFrame(scrollToTop);
    window.scrollTo(0, c - c/8);
  }
}

Similarity between arrays

Use filter() to remove values that are not part of values, determined using includes().

const difference = (arr, values) => arr.filter(v => values.includes(v));

Sort characters in string (alphabetical)

Split the string using split(''), sort() utilizing localeCompare(), recombine using join('').

const sortCharactersInString = str =>
  str.split('').sort( (a,b) => a.localeCompare(b) ).join('');

Sum of array of numbers

Use reduce() to add each value to an accumulator, initialized with a value of 0.

const sum = arr =>
  arr.reduce( (acc , val) => acc + val, 0);

Swap values of two variables

Use array destructuring to swap values between two variables.

[varA, varB] = [varB, varA];

Tail of list

Return arr.slice(1).

const tail = arr => arr.slice(1);

Unique values of array

Use ES6 Set and the ...rest operator to discard all duplicated values.

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

URL parameters

Use match() with an appropriate regular expression to get all key-value pairs, map() them appropriately. Combine all key-value pairs into a single object using Object.assign() and the spread operator (...). Pass location.search as the argument to apply to the current url.

const getUrlParameters = url =>
  Object.assign(...url.match(/([^?=&]+)(=([^&]*))?/g).map(m => {[f,v] = m.split('='); return {[f]:v}}));

UUID generator

Use crypto API to generate a UUID, compliant with RFC4122 version 4.

const uuid = _ =>
  ( [1e7]+-1e3+-4e3+-8e3+-1e11 ).replace( /[018]/g, c =>
    (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
  )

Validate number

Use !isNaN in combination with parseFloat() to check if the argument is a number. Use isFinite() to check if the number is finite.

const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n);

Credits

Icons made by Smashicons from www.flaticon.com is licensed by CC 3.0 BY.