Javascript 这个展平的递归版本?

Javascript 这个展平的递归版本?,javascript,recursion,Javascript,Recursion,假设这样一个结构: [ {name: 'a', children: [{name: 'c', children: [...]}]}, {name: 'b', children: [{name: 'd', children: [...]}]} ] 也就是说,N级深 获取平面数组中所有元素的递归方法是什么 [{name: a}, {name: b}, ...] 请注意,父母可以有多个子女。您可以这样做 function recursivelyAdd(el, array) { array

假设这样一个结构:

[
{name: 'a', children: [{name: 'c', children: [...]}]}, 
{name: 'b', children: [{name: 'd', children: [...]}]}
]
也就是说,N级深

获取平面数组中所有元素的递归方法是什么

[{name: a}, {name: b}, ...]

请注意,父母可以有多个子女。

您可以这样做

function recursivelyAdd(el, array) {
    array.push(el);

    for (var i=0; i< el.children.length; i++) {
        recursivelyAdd(el.children[i], array);
    }

    delete el.children;
}

此答案将删除循环,不会修改原始对象。

谢谢!我在一次调用函数多次时犹豫不决,认为正确的方法是在函数中有一个额外的参数来传递表示状态的数组。@rollingBalls:使用递归时,需要1)一个终止符(递归结束的方法)和2)一种收集结果的方法(通过存储每个函数返回的内容,或者传递您提到的“状态”)。在我的递归函数中,1.是在没有子函数时实现的(因为我们不再递归)。2是通过添加到我们正在传递的数组中实现的。感谢您的澄清。因此,具有状态的替代版本也是“可接受”的解决方案。我认为您的实现更简单:)…好吧,您可以从语法上删除循环。
reduce()
仍将在内部执行:)。是的。开发人员不必考虑这一点。
var ar = [];

recursivelyAdd(rootPerson, ar);

// ar will now be all the people!
var struc = [
{name: 'a', children: [{name: 'c', children: []}]}, 
{name: 'b', children: [{name: 'd', children: []}]}
];

function getNames(children) {
  return children.reduce(function(names, child) {
    return names.concat(child.name, getNames(child.children));
  }, []);
};

getNames(struc);
// ["a", "c", "b", "d"]