у меня есть следующий массив словарей с приведенным ниже в качестве примера одного словаря
{
"id": 80,
"name": "Low Level Topic",
"questions": [
{
"id": 23,
"shortName": null,
"name": "Some question"
},
{
"id": 24,
"shortName": null,
"name": "Some question 2"
}
],
"parentTopic": {
"id": 10,
"name": "Higher Level Topic",
"parentTopic": {
"id": 1,
"name": "Top Level Topic",
"parentTopic": null
}
}
}
}
и я хотел бы перевернуть дерево, чтобы получить следующее
{
"id": 1,
"name": "Top Level Topic",
"childTopic": {
"id": 10,
"name": "Higher Level Topic",
"childTopic": {
"id": 80,
"name": "Low Level Topic",
"questions": [
{
"id": 23,
"shortName": null,
"name": "Some question"
},
{
"id": 24,
"shortName": null,
"name": "Some question 2"
}
],
}
}
}
Я пытался найти простой способ регенерировать/реструктурировать данные, но безуспешно. Я был бы признателен, если бы кто-нибудь мог помочь
По сути, эта проблема заключается в том, чтобы перевернуть связанный список и немного изменить его структуру.
let data = {"id":80,"name":"Low Level Topic","questions":[{"id":23,"shortName":null,"name":"Some question"},{"id":24,"shortName":null,"name":"Some question 2"}],"parentTopic":{"id":10,"name":"Higher Level Topic","parentTopic":{"id":1,"name":"Top Level Topic","parentTopic":null}}};
// WARNING: this code MUTATES the object
// previous topic, current topic, new tail as 'tail'
let prev = null, curr = data, tail = data.parentTopic;
while (curr) {
next = curr.parentTopic;
delete curr.parentTopic; // rename parentTopic
curr.childTopic = prev; // to childTopic
prev = curr;
curr = next;
}
delete tail.childTopic.childTopic; // delete since it's null
data = prev; // assign new head to data
console.info(data);
.as-console-wrapper { max-height: 100% !important }
Вы можете использовать простую рекурсию, и она не изменит исходный объект.
let obj = {"id":80,"name":"Low Level Topic","questions":[{"id":23,"shortName":null,"name":"Some question"},{"id":24,"shortName":null,"name":"Some question 2"}],"parentTopic":{"id":10,"name":"Higher Level Topic","parentTopic":{"id":1,"name":"Top Level Topic","parentTopic":null}}};
const buildReverseObj = (originalObj, currObj) => {
const copyObj = { // make copy of original obj
...originalObj,
};
const parentTopic = copyObj.parentTopic; // get the parentTopic to process in next step
delete copyObj.parentTopic; // parentTopic should be removed
const childTopic = { // make a child topic in every step it consists of older contents and newer contents
...copyObj,
...currObj
};
if (!parentTopic) return childTopic; // when parentTopic = null we are done
return buildReverseObj(parentTopic, { childTopic });
};
console.info(buildReverseObj(obj, {}));
Спасибо Асраф, это сработало хорошо :)