Javascript список циклов / рекурсия для создания объекта - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь создать функцию для обработки списка чисел, относящихся к глубине, используя рекурсию или циклы в JavaScript.

Следующий «ввод» должен быть обработан в «вывод», и он должен работать для произвольных списков.

Следует отметить, что числа увеличиваются либо на 0, либо на 1, но могут уменьшаться на любую сумму.

var input = [0, 1, 2, 3, 1, 2, 0]

var output =
  [ { number: 0, children: 
      [ { number: 1, children: 
          [ { number: 2, children: 
              [ { number: 3, children: [] } ]
            } 
          ] 
        } 
      , { number: 1, children: 
          [ { number: 2, children: [] } ]
        } 
      ] 
    } 
  , { number: 0, children: [] } 
  ] 

Я решил это сам, хотя это требует некоторой доработки.

var example = [0, 1, 2, 2, 3, 1, 2, 0]
var tokens = []
var last = 0
const createJSON = (input, output) => {
  if (input[0] === last) {
    output.push({ num: input[0], children: [] })
    createJSON(input.splice(1), output)
  } 
  else if (input[0] > last) {
    last = input[0]
    output.push(createJSON(input, output[output.length-1].children))
  } 
  else if (input[0] < last) {
    var steps = input[0]
    var tmp = tokens
    while (steps > 0) {
      tmp = tmp[tmp.length-1].children
      steps--
    }
    tmp.push({ num: input[0], children: [] })
    createJSON(input.splice(1), tmp)
  }
}
createJSON(example, tokens)
console.log(tokens)

Ответы [ 2 ]

1 голос
/ 10 января 2020

На самом деле это очень простая проблема, которую нужно решить ...

var input   = [0, 1, 2, 3, 1, 2, 0]
  , output  = []
  , parents = [output]
  ;
for(el of input)
  {
  let nv = { number:el, children:[] }
  parents[el].push( nv )
  parents[++el] = nv.children  // save the  @ddress of children:[] for adding items on
  }
console.log( output )
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 10 января 2020

Вот функциональное решение на основе рекурсии и Array.prototype.reduce:

const data = [0, 1, 2, 3, 1, 2, 0]
const last = xs => xs.length > 0 ? xs[xs.length - 1] : undefined
const lastD = (d, t, i = 0) => i > d ? t : lastD(d, last(t).children, i + 1)
const buildIt = xs => xs.reduce(
  (a, x) =>((x === 0 ? a : lastD(x - 1, a)).push({ number: x, children: [] }), a),
  []
)

console.log(buildIt(data))
.as-console-wrapper { max-height: 100% !important; top: 0; }

Примечание: это решение не зависит от мутации дополнительных переменных для целей бухгалтерского учета.

Оказывается, что настоящая проблема была значительно проще решить, чем моя первоначальная неверная интерпретация!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...