Javascript列表循环/递归创建对象

时间:2020-01-09 23:29:04

标签: javascript

我正在尝试创建一个函数,以使用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 个答案:

答案 0 :(得分:1)

实际上,这是一个非常简单的问题,需要解决...

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; }

答案 1 :(得分:0)

这是基于递归和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; }

注意:此解决方案不依赖于记账目的其他变量的突变。

事实证明,实际问题比我最初的误解要容易得多!