Last active
March 12, 2024 13:38
-
-
Save chrisryana/2c767e6f29cfba1899d0a4ed727c00bd to your computer and use it in GitHub Desktop.
Полезные функции на чистом js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Пример зачем нужен throttle https://webdevkin.ru/posts/frontend/kak-ispolzovat-throttle-i-debounce | |
function throttle(fn, ms) { | |
let lastTime; | |
return function throttled() { | |
let timeSinceLastExecution = Date.now() - lastTime; | |
if(!lastTime || (timeSinceLastExecution >= ms)) { | |
fn.apply(this, arguments); | |
lastTime = Date.now(); | |
} | |
}; | |
} | |
// Пример зачем нужен debounce https://webdevkin.ru/posts/frontend/kak-ispolzovat-throttle-i-debounce | |
function debounce(fn, ms) { | |
let timer; | |
return function debounced() { | |
clearTimeout(timer); | |
let args = arguments; | |
let that = this; | |
timer = setTimeout(function callOriginalFn() { | |
fn.apply(that, args); | |
}, ms); | |
}; | |
} | |
// Функция выполнится один раз независимо от количества вызывов | |
function once(fn){ | |
let returnValue; | |
let canRun = true; | |
return function runOnce(){ | |
if(canRun) { | |
returnValue = fn.apply(this, arguments); | |
canRun = false; | |
} | |
return returnValue; | |
} | |
} | |
// Функция выполнится заданное количество раз | |
function after(count, fn) { | |
let runCount = 0; | |
return function runAfter() { | |
runCount = runCount + 1; | |
if (runCount >= count) { | |
return fn.apply(this, arguments); | |
} | |
} | |
} | |
// Функция проверяет пустой ли объект | |
function isEmpty(obj) { | |
return Object.keys(obj).length === 0 && empty.constructor === Object | |
} | |
// Задачка из Uber | |
// - you have a list of 1000 items | |
// - you have an async function process(item) | |
// - you need to process all items | |
// - it needs to be done concurrently, but not more than 25 at a time | |
// - collect items with errors | |
// what's the cleanest way to do this? | |
// libraries allowed | |
export const batch = (list, process, maxXount = 1) => { | |
const next = []; | |
return Promise.allSettled( | |
list.map((item, index) => | |
new Promise((tick) => { | |
i < parallel ? tick() : next.push(tick); | |
}) | |
.then(() => process(item)) | |
.finally(() => next.shift()?.()) | |
) | |
} | |
// регулярка для числа больше нуля длины из 15 цифр | |
const POSITIVE_NUMBER_REGEXP = /(^[1-9]{1}\d{0,14}$)|(^$)/; | |
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => { | |
event.preventDefault(); | |
const value = event.target.value.replace(/\s/g, ''); | |
if (value.match(POSITIVE_NUMBER_REGEXP)) { | |
setValue(value) | |
} | |
}; | |
<input | |
onChange={handleChange} | |
value={value.toLocaleString('ru-RU')} | |
placeholder={placeholder.toLocaleString('ru-RU')} | |
inputMode="numeric" | |
/> | |
// Генерация человекопонятного урла (ЧПУ) | |
const lettersMap = { | |
а: 'a', | |
б: 'b', | |
в: 'v', | |
г: 'g', | |
д: 'd', | |
е: 'e', | |
ё: 'e', | |
ж: 'zh', | |
з: 'z', | |
и: 'i', | |
й: 'y', | |
к: 'k', | |
л: 'l', | |
м: 'm', | |
н: 'n', | |
о: 'o', | |
п: 'p', | |
р: 'r', | |
с: 's', | |
т: 't', | |
у: 'u', | |
ф: 'f', | |
х: 'h', | |
ц: 'c', | |
ч: 'ch', | |
ш: 'sh', | |
щ: 'sch', | |
ь: '', | |
ы: 'y', | |
ъ: '', | |
э: 'e', | |
ю: 'yu', | |
я: 'ya', | |
}; | |
export default (text: string) => { | |
const symbols = text.toLowerCase().split(''); | |
const chpu = symbols | |
// подставляем значения из карты символов для каждой буквы, если значения нет оставляем как есть | |
.map((item: keyof typeof lettersMap) => (lettersMap[item] || item)) | |
// собираем в строку | |
.join('') | |
// меняем все кроме цифр и латинских букв на дефис | |
.replace(/[^-0-9a-z]/g, '-') | |
// если в строке несколько дефисов подряд, меняем на один | |
.replace(/[-]+/g, '-') | |
// удаляем дефис в начале и в конце | |
.replace(/^-|-$/g, ''); | |
return chpu; | |
}; | |
// Установить дефолтную версию node | |
nvm alias default 18.16.0 | |
nvm use 18.16.0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment