TLDR; Если у меня есть массив, содержащий объекты, и некоторые из этих объектов являются массивами, которые содержат больше объектов, как я могу рекурсивно выполнить цикл по ним и вернуть одно из вложенных значений?С моим кодом ниже, использование return анализирует только первый элемент.Если я не использую return, значение теряется, потому что оно уничтожается в одной из областей рекурсии.
var currentNode = [{...}, {...}, { items: [{...}, {...}] }]
// If it's not found, looping through the children (there should be more wrapper nodes in the children)
for (let node of currentNode) {
if (node.uuid === uuidToFind) {
return node;
}
// THIS CAN'T LOOP
// BUT there's a lexical scoping problem if I don't use `return`
return searchTreeForNode(node, nodeUuidToFind);
}
}
Более подробное описание:
Я сейчас имею делос древовидной структурой, которая в настоящее время сохраняется в состоянии Vuex.
Прежде чем я приступлю к проблеме, у меня есть два вопроса:
- Есть ли способ решить лексическую область видимости?проблема, с которой я сталкиваюсь?
- Если нет, как звучит мое альтернативное предлагаемое решение?
Кроме того, для краткости, у меня есть копия демонстрационной версии JSFiddle здесь .
С попыткой решения, приведенной ниже, у меня возникли проблемы с лексическим ограничением в моей функции рекурсии (в частности, в последнем цикле for of
.
Но позвольте мне начать с описаниядерево. У него есть два вида узлов.
individual node
, который выглядит следующим образом:
{
name: `string`
value: `string`
}
и wrapper node
. Дочерние элементы в wrapper node
могут бытьindividual node
или wrapper node
.
Его структура выглядит следующим образом:
{
type: `string`,
children: [
{},
{},
...
]
}
ThesУзлы также могут быть вложены бесконечное число раз.
Вот пример объекта:
{
type: `level 1`,
children: [
{
type: `level 2`,
children: [
{
type: `level 3`,
children: []
},
{
name: `item 1`,
value: `value 1`
},
{
name: `item 2`,
value: `value 2`
},
...
]
},
{
name: `item 1`,
value: `value 1`
},
{
type: `level 2.1`,
children: [
{
name: `item 3`,
value: `value 3`
}
...
]
}
...
]
}
С этим деревом я хотел бы иметь возможность добавлять individual nodes
и wrapper nodes
где-нибудь в дереве, но у меня возникают проблемы с этим.
Моя первая попытка состояла в том, чтобы обойти каждый узел и присвоить ему UUID.План состоял в том, чтобы пройтись по дереву, и когда я нашел соответствующий UUID, я мог манипулировать им по мере необходимости.
Вот как выглядел код для этой попытки:
// This starts with the top-level wrapper node
function searchTreeForNode(currentNode, nodeUuidToFind) {
if (currentNode.uuid === nodeUuidToFind) {
return currentNode;
}
// If it's a wrapper node, parse the children
if (currentNode.hasOwnProperty("type")) {
return searchTreeForNode(currentNode.children, nodeUuidToFind);
}
// If it's the contents of a wrapper node, see if that node lives in them
if (Array.isArray(currentNode)) {
let resolvedUuids = [];
for (let node of currentNode) {
resolvedUuids.push(node.uuid);
}
// If found, return the node
let uuidLocation = resolvedUuids.indexOf(nodeUuidToFind);
if (uuidLocation !== -1) {
return currentNode[uuidLocation];
}
// If it's not found, looping through the children (there should be more wrapper nodes in the children)
for (let node of currentNode) {
// THIS CAN'T LOOP
// BUT there's a lexical scoping problem if I don't use `return`
return searchTreeForNode(node, nodeUuidToFind);
}
}
}
Можно ли получить приведенный выше код работает?В частности, цикл через дочерние элементы узла-обертки?
Если нет, моя идея сейчас состоит в том, чтобы вместо того, чтобы просто иметь дерево в состоянии, иметь три вещи.
nodeTree
- объект, имеющий ту же форму, что и исходные данные, но каждый узел представляет собой только UUID allRuleUuids
- массив строк.Каждая строка представляет собой UUID узла nodeDataByUuid
- Объект, который связан с UUID в массиве allRuleUuids
.Каждый объект будет содержать данные для каждого узла.
Мне нужно поддерживать следующее поведение:
- Добавление
individual node
и wrapper node
в любом местеtree. - Удаление
individual node
и wrapper node
(включая всех его дочерних элементов) из любой части дерева.
Заранее спасибо за помощь!