首页 > 解决方案 > 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)

标签: javascript

解决方案


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

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


推荐阅读