#javascript
#javascript
Вопрос:
Я пытаюсь клонировать объект, который заморожен с помощью npm deep-freeze, но функция больше не будет запускаться.
Я попытался запустить if(typeof === "object")
, за которым следует Object.assign
, но это дает мне
Ошибка типа: не удается назначить свойство только для чтения
function updateTree(tree, id, values) {
const treeData = JSON.parse(JSON.stringify(tree));
const dataKeys = Object.keys(tree[id]);
for (let property in treeData) {
if (property === treeData[id].id) {
dataKeys.forEach(key =>
key in values ? Object.assign(treeData[id], values) : null
);
if (treeData[id].children.length >= 1) {
treeData[id].children.map(childId =>
updateTree(treeData, childId, values)
);
}
}
}
return treeData;
}
test("update child nodes", t => {
const tree = freeze({
"1": {
id: "1",
foo: "",
baz: "",
children: ["2", "3"]
},
"2": {
id: "2",
foo: "",
baz: "",
children: ["4", "5"]
},
"3": {
id: "3",
foo: "",
baz: "",
children: ["6"]
},
"4": {
id: "4",
foo: "",
baz: "",
children: ["7"]
},
"5": {
id: "5",
foo: "",
baz: "",
children: []
},
"6": {
id: "6",
foo: "",
baz: "",
children: []
},
"7": {
id: "7",
foo: "",
baz: "",
children: []
}
});
updateTree(tree, "2", {
foo: "bar",
baz: "qux"
})
Ожидаемый результат — запуск функции updateTree(), поэтому функция является рекурсивной
updateTree(treeData, childId, values)
Комментарии:
1.
JSON.parse(JSON.stringify(tree))
— о, наивная копия, о, бесполезность…2. @user633183 вероятно, пытается удалить все функциональные и неопределенные ключи?
3. Я не могу воспроизвести проблему с опубликованным вами кодом. Вы никогда не назначаете что-то, что имеет свойства только для чтения? Также, возможно, вам следует начать все сначала. Ваш код делает действительно странные вещи (например
key in values ? …
, илиmap
вызов, результат которого отбрасывается).4. Вы упомянули npm deep-freeze, как будто это главная проблема. Вероятно, вам нужно показать этот код.