递归方法转换,直到数组用尽

时间:2019-11-21 15:38:17

标签: javascript typescript

我的代码中有一个笨拙且无法扩展的方法。

y 是具有键/值的对象的 array 对象,具有两个属性:

名称字符串属性,该属性是唯一的: 该值由 children 属性进行区分,该属性是与y具有相同对象类型的另一个数组。

for (var i = 0; i < y.length; i++) {
  let objx = y[i];
  let name = objx["name"];
  let inner = objx["children"];

  for (var i = 0; i < inner.length; i++) {
    var z = inner[i]["name"];
    let h = inner[i]["children"];
    console.log(h);
  }

  // more for loops on the h object now, and so on.
}

是否有可能只构建一个包含所有 name 字符串属性的新集合,直到所有各个 children 属性都返回0的方法? >

3 个答案:

答案 0 :(得分:1)

let y = {
  name: 'parent',
  children: [
    {name: 'child1', children: []},
    {
      name: 'child2', children: [
        {name: 'grandChild1', children: []}
      ]
    },
  ]
};

let getNames = y => [y.name, ...y.children.flatMap(getNames)];
let names = getNames(y);
console.log(names);

答案 1 :(得分:0)

您可以采用递归函数。

source

答案 2 :(得分:0)

这是基本的递归。创建一个循环数据并使用子代调用的函数。

var myData = [{
  name: 'foo',
  children: [{
    name: 'foo-1',
    children: [{
      name: 'foo-1-1'
    }]
  }, {
    name: 'foo-2',
    children: [{
      name: 'foo-2-1'
    }]
  }]
}]


function loopOver(array, result) {
  array.forEach( function (data) {
    console.log(data.name)
    result.push(data.name)
    if (data.children) {
      return loopOver(data.children, result)
    }
  })
  return result
}

console.log(loopOver(myData, []))