Как получить детей на круговой карте - PullRequest
0 голосов
/ 12 июня 2018

Может быть, я просто глуп, но я не могу заставить это работать прямо сейчас.Я пытаюсь получить все дочерние элементы свойства внутри объекта, следуя массиву дочерних объектов.Он должен включать все узлы в структуре.

В основном массивы в качестве значений содержат больше реквизитов, которые также присутствуют на карте.Это своего рода поддельная древовидная структура.

Это входные данные:

const input = {
  a: ["b", "c"],
  b: ["d", "e"],
  c: ["f", "g"]
}

В качестве выходных данных я ожидаю, что результат вызова функции, подобного getChildrenOfProp(input, "a"), приведет к следующему:

getChildrenOfProp(input, "a");
// results in ["b", "c", "d", "e", "f", "g"]
// because "b" & "c" are present in map and have more children ..

getChildrenOfProp(input, "b");
// results in ["d", "e"]
// no more children because "d" & "e" are not present in the map ..

1 Ответ

0 голосов
/ 12 июня 2018

Всякий раз, когда вы имеете дело с чем-либо, что даже отдаленно напоминает дерево, вы, вероятно, захотите рекурсию.

Примерно так будет работать:

function getChildrenOf(input, target) {
  let result = [target];
    
  // recurse through children
  if (input[target]) {
    input[target].forEach(child => result = result.concat(getChildrenOf(input, child)));
  }
 
  return result;
}

const input = {
  a: ['b', 'c'],
  b: ['d', 'e'],
  c: ['f', 'g'],
  h: ['i', 'l'] // not gotten with a
}

console.log(getChildrenOf(input, 'a'))

По сути, пройдите один раз и добавьте саму цель, а затем переберите ее дочерние элементы и сложите их все вместе.

Если вы этого не хотитечтобы содержать a сам, тогда вы можете использовать эту слегка измененную версию вместо:

function getChildrenOf(input, target, result) {
  result = result || [];
    
  // recurse through children
  if (input[target]) {
    input[target].forEach(child => { 
      result.push(child);
      getChildrenOf(input, child, result)
    });
  }
 
  return result;
}

const input = {
  a: ['b', 'c'],
  b: ['d', 'e'],
  c: ['f', 'g'],
  h: ['i', 'l'] // not gotten with a
}

console.log(getChildrenOf(input, 'a'))
console.log(getChildrenOf(input, 'b'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...