Skip to content

Instantly share code, notes, and snippets.

@chrisryana
Last active March 12, 2024 13:38
Show Gist options
  • Save chrisryana/2c767e6f29cfba1899d0a4ed727c00bd to your computer and use it in GitHub Desktop.
Save chrisryana/2c767e6f29cfba1899d0a4ed727c00bd to your computer and use it in GitHub Desktop.
Полезные функции на чистом js
// Пример зачем нужен 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