Skip to content

Instantly share code, notes, and snippets.

@sxidsvit
Last active April 19, 2025 18:25
Show Gist options
  • Save sxidsvit/58934543acd1e57b176a04e96881aa86 to your computer and use it in GitHub Desktop.
Save sxidsvit/58934543acd1e57b176a04e96881aa86 to your computer and use it in GitHub Desktop.
deepClone() + JSON.parse() + debounce()
function deepClone(obj, visited = new WeakMap()) {
// Обработка примитивов и null
if (obj === null || typeof obj !== 'object') {
return obj;
}
// Обработка циклических ссылок
if (visited.has(obj)) {
return visited.get(obj);
}
// Обработка специальных типов
if (obj instanceof Date) {
return new Date(obj);
}
if (obj instanceof RegExp) {
return new RegExp(obj);
}
if (obj instanceof Map) {
const clone = new Map();
visited.set(obj, clone);
obj.forEach((value, key) => {
clone.set(deepClone(key, visited), deepClone(value, visited));
});
return clone;
}
if (obj instanceof Set) {
const clone = new Set();
visited.set(obj, clone);
obj.forEach(value => {
clone.add(deepClone(value, visited));
});
return clone;
}
// Обработка массивов
if (Array.isArray(obj)) {
const clone = [];
visited.set(obj, clone);
obj.forEach((item, index) => {
clone[index] = deepClone(item, visited);
});
return clone;
}
// Обработка объектов
const clone = Object.create(Object.getPrototypeOf(obj));
visited.set(obj, clone);
Object.keys(obj).forEach(key => {
clone[key] = deepClone(obj[key], visited);
});
return clone;
}
// Пример использования
const obj = {
date: new Date(),
regex: /test/,
map: new Map([['key', 'value']]),
nested: { a: 1, b: new Set([1, 2]) }
};
obj.circular = obj; // Циклическая ссылка
const cloned = deepClone(obj);
console.log(cloned);
=================================================
if (typeof str !== 'string' || !str.trim()) return false;
try {
JSON.parse(str);
return true;
} catch {
return false;
}
=================================================
function debounce(callback, delay) {
let timeoutId;
return function run() {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => {
callback();
}, delay);
}();
}
debounce(() => console.log("Called"), 1000); // Вызывает "Called" через 1000 мс
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment