Last active
April 19, 2025 18:25
-
-
Save sxidsvit/58934543acd1e57b176a04e96881aa86 to your computer and use it in GitHub Desktop.
deepClone() + JSON.parse() + debounce()
This file contains hidden or 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
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