Назад к вопросам
Middle
2
function cloneDeep(something: Cloneable): Cloneable { /* * TODO: implement deep clone without JSON.parse/stringify */ return JSON.parse(JSON.stringify(something)); } function assertDeep(a: Cloneable, b: Cloneable) { if (JSON.stringify(a) !== JSON.stringify(b)) { console.error("Not OK"); } console.log("OK"); } const obj: Cloneable = { a: 1, b: true, c: "hello", d: { there: "are", some: ["properties"] }, e: {}, f: [(), (), { key: { value: [1, 2, "3", "four"] } }], g: [] }; assertDeep(obj, cloneDeep(obj));
Компании, где спрашивали
Trading view
Ответ от нейросети
sobes.tech AI
Для реализации глубокого клонирования без использования JSON.parse(JSON.stringify(...)) можно написать рекурсивную функцию, которая будет копировать объекты, массивы и примитивы. Важно учитывать циклические ссылки и типы данных, но для упрощения примера реализуем базовый вариант без поддержки циклов.
function cloneDeep(something: any): any {
if (something === null || typeof something !== 'object') {
return something; // Примитивы возвращаем как есть
}
if (Array.isArray(something)) {
return something.map(item => cloneDeep(item));
}
const clonedObj: any = {};
for (const key in something) {
if (Object.prototype.hasOwnProperty.call(something, key)) {
clonedObj[key] = cloneDeep(something[key]);
}
}
return clonedObj;
}
function assertDeep(a: any, b: any) {
if (JSON.stringify(a) !== JSON.stringify(b)) {
console.error("Not OK");
} else {
console.log("OK");
}
}
const obj = {
a: 1,
b: true,
c: "hello",
d: {
there: "are",
some: ["properties"]
},
e: {},
f: [null, null, { key: { value: [1, 2, "3", "four"] } }],
g: []
};
assertDeep(obj, cloneDeep(obj));
Обратите внимание, что в исходном коде были вызовы () в массиве, которые не валидны, я заменил их на null для корректности.
Этот код рекурсивно копирует объекты и массивы, создавая глубокую копию без использования JSON-сериализации.