интересно
В последнее время было жаркоgithubбиблиотека на30-seconds-of-code, особенно интересно, а код элегантен.
- Может выучить es6
- Переводите сами, чтобы выучить английский язык
arrayGcd
Calculates the greatest common denominator (gcd) of an array of numbers.
Use
Array.reduce()and thegcdformula (uses recursion) to calculate the greatest common denominator of an array of numbers.const arrayGcd = arr =>{ const gcd = (x, y) => !y ? x : gcd(y, x % y); return arr.reduce((a,b) => gcd(a,b)); } // arrayGcd([1,2,3,4,5]) -> 1 // arrayGcd([4,8,12]) -> 4
использоватьArray.reduce()а такжеgcdФормула (с использованием рекурсии) для вычисления наибольшего общего делителя массива.
➜ code cat arrayGcd.js
const arrayGcd = arr => {
const gcd = (x, y) => !y ? x : gcd(y, x % y);
return arr.reduce((a, b) => gcd(a, b));
}
console.log(arrayGcd([1, 2, 3, 4, 5]));
console.log(arrayGcd([4, 8, 12]));
➜ code node arrayGcd.js
1
4
gcdТо есть алгоритм Евклида, конкретики не перечислить, самопроверка. Здесь используется метод сокращения массива, который довольно лаконичен.Если вы мало знаете о сокращении, посмотрите на него.mdnЯ понимаю.
arrayLcm
Calculates the lowest common multiple (lcm) of an array of numbers.
Use
Array.reduce()and thelcmformula (uses recursion) to calculate the lowest common multiple of an array of numbers.const arrayLcm = arr =>{ const gcd = (x, y) => !y ? x : gcd(y, x % y); const lcm = (x, y) => (x*y)/gcd(x, y) return arr.reduce((a,b) => lcm(a,b)); } // arrayLcm([1,2,3,4,5]) -> 60 // arrayLcm([4,8,12]) -> 24
Вычисляет наименьшее общее кратное массива.
использоватьArray.reduce()а такжеlcmФормула (с использованием рекурсии) для вычисления наибольшего общего делителя массива.
➜ code cat arrayLcm.js
const arrayLcm = arr => {
const gcd = (x, y) => (!y ? x : gcd(y, x % y));
const lcm = (x, y) => x * y / gcd(x, y);
return arr.reduce((a, b) => lcm(a, b));
};
console.log(arrayLcm([1, 2, 3, 4, 5]));
console.log(arrayLcm([4, 8, 12]));
➜ code node arrayLcm.js
60
24
lcmАлгоритм использует предыдущийgcdКлючевым моментом алгоритма является то, что произведение наибольшего общего делителя и наименьшего общего кратного двух чисел является в точности произведением этих двух чисел.
arrayMax
Returns the maximum value in an array.
Use
Math.max()combined with the spread operator (...) to get the maximum value in the array.const arrayMax = arr => Math.max(...arr); // arrayMax([10, 1, 5]) -> 10
Возвращает наибольшее значение в массиве.
использоватьMath.max()а такжеES6спред оператор…Возвращает наибольшее значение в массиве.
➜ code cat arrayMax.js
const arrayMax = arr => Math.max(...arr);
console.log(arrayMax([10, 1, 5]));
➜ code node arrayMax.js
10
фактическиMath.max()Об этом нечего сказать.
arrayMin
Returns the minimum value in an array.
Use
Math.min()combined with the spread operator (...) to get the minimum value in the array.const arrayMin = arr => Math.min(...arr); // arrayMin([10, 1, 5]) -> 1
Возвращает наименьшее значение в массиве.
использоватьMath.min()а такжеES6спред оператор…Возвращает наименьшее значение в массиве.
➜ code cat arrayMin.js
const arrayMin = arr => Math.min(...arr);
console.log(arrayMin([10, 1, 5]));
➜ code node arrayMin.js
1
фактическиMath.min()Об этом нечего сказать.
chunk
Chunks an array into smaller arrays of a specified size.
Use
Array.from()to create a new array, that fits the number of chunks that will be produced. UseArray.slice()to map each element of the new array to a chunk the length ofsize. If the original array can't be split evenly, the final chunk will contain the remaining elements.const chunk = (arr, size) => Array.from({length: Math.ceil(arr.length / size)}, (v, i) => arr.slice(i * size, i * size + size)); // chunk([1,2,3,4,5], 2) -> [[1,2],[3,4],[5]]
Согласно данномуsizeНарезать на массив, содержащийsizeМассив меньших блоков массива.
использоватьArray.from()Создает новый массив, соответствующий определению. использоватьArray.slice()перехватить указанныйsizeэлементы для формирования нового блока массива. Если оригинальная длина массива не может бытьsizeДелимые, последние оставшиеся элементы будут принадлежать последнему блоку.
➜ code cat chunk.js
const chunk = (arr, size) =>
Array.from({ length: Math.ceil(arr.length / size) }, (v, i) =>
arr.slice(i * size, i * size + size)
);
console.log(chunk([1, 2, 3, 4, 5], 2));
➜ code node chunk.js
[ [ 1, 2 ], [ 3, 4 ], [ 5 ] ]
Array.from(arrayLike, mapFn, thisArg)В этом методе первый параметр представляет собой массив или итерируемый объект, второй параметр — это метод, который применяется к каждому элементу массива, а третий параметр — изменение.thisуказал на. С точки зрения непрофессионала, это означает, кто твой отец.
использовал один здесь{ length: Math.ceil(arr.length / size) }объект итератора,lengthуказывает количество итераций, что точно соответствуетsizeДлина разделенного массива равна длине исходного массива, деленному наsizeЗначение, которое необходимо округлить. Округление заключается в удовлетворении ситуации, которая не является полностью делимой. Например, 5 элементов делятся на 2 блока.Если два элемента разделить на два блока, последний оставшийся элемент становится независимым блоком, в котором всего 3 элемента.
(v, i), так как массив начинается с каждой позиции во время итерацииundefinedинициализирован, поэтомуvВсегдаundefined.
arr.slice(i * size, i * size + size)Каждый перехват в итеративном процессеsizeКоличество элементов для формирования нового массива. здесьiзаключается в изменении с итерацией, напримерlength3,iЭто 0,1,2.
Вот аналогичный итеративныйpythonвнутреннийrange.
➜ code python
Python 3.6.4 (default, Dec 23 2017, 10:37:40)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> arr = [1,2,3,4,5]
>>> size = 2
>>> for i in range(math.ceil(len(arr) / size)):
... print('index: ', i)
...
index: 0
index: 1
index: 2
compact
Removes falsey values from an array.
Use
Array.filter()to filter out falsey values (false,null,0,"",undefined, andNaN).const compact = arr => arr.filter(Boolean); // compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) -> [ 1, 2, 3, 'a', 's', 34 ]
falseyЭлементы. (этоfalseyfalse!!операция).
использоватьArray.filter()Пучокfalse,null,0,"",undefinedа такжеNaNЭтиfalseyОтфильтрованы.
➜ code cat compact.js
const compact = arr => arr.filter(Boolean);
console.log(compact([0, 1, false, 2, "", 3, "a", "e" * 23, NaN, "s", 34]));
➜ code node compact.js
[ 1, 2, 3, 'a', 's', 34 ]
Array.prototype.filter()Сухой, нечего сказать.
countOccurrences
Counts the occurrences of a value in an array.
Use
Array.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); // countOccurrences([1,1,2,1,2,3], 1) -> 3
использоватьArray.reduce()
➜ code cat countOccurrences.js
const countOccurrences = (arr, value) =>
arr.reduce((a, v) => (v === value ? a + 1 : a + 0), 0);
console.log(countOccurrences([1, 1, 2, 1, 2, 3], 1));
console.log(countOccurrences([1, 1, 2, 1, 2, 3], 5));
➜ code node countOccurrences.js
3
0
Тернарный оператор(v === value ? a + 1 : a + 0)vvalueЭто числоa+1;нет,a+0.
0 после последней запятой является начальным значением, т.е.a=0, это понимаетreduceМетод известен, и специально указано, что, поскольку эта функция должна иметь возвращаемое значение, если указанный элемент ни разу не появляется в массиве, возвращаемое значение равно0, поэтому он должен быть инициализирован как0.
deepFlatten
Deep flattens an array.
Use recursion. Use
Array.concat()with an empty array ([]) and the spread operator (...) to flatten an array. Recursively flatten each element that is an array.const deepFlatten = arr => [].concat(...arr.map(v => Array.isArray(v) ? deepFlatten(v) : v)); // deepFlatten([1,[2],[[3],4],5]) -> [1,2,3,4,5]
Глубина выравнивания массива.
Используйте рекурсивный метод. комбинироватьArray.concat()пустой массив[]а такжеES6спред оператор…Чтобы сгладить массив, если сведенный элемент все еще является массивом, используйте метод рекурсивно.
➜ code cat deepFlatten.js
const deepFlatten = arr =>
[].concat(...arr.map(v => (Array.isArray(v) ? deepFlatten(v) : v)));
console.log(deepFlatten([1, [2], [[3], 4], 5]));
➜ code node deepFlatten.js
[ 1, 2, 3, 4, 5 ]
Тернарный оператор(Array.isArray(v) ? deepFlatten(v) : v)судитьvЭто массив, да, возврат рекурсивно применяетсяdeepFlatten(v)Значение; НЕТ, возврат напрямуюv.
[].concat(...arr.map(fn))map…
underscoreТам.实现的方法就是再加一个标志参数进行处理即可。具体不讲了。
Персональный уровень перевода ограничен, приглашаю всех критиковать и исправлять ошибки.JavaScript 30 секунд, от входа до отказа