【问题标题】:How to make a recursive method如何制作递归方法
【发布时间】:2020-08-18 02:59:31
【问题描述】:

我正在尝试在 javascript 中创建一个递归方法,但我创建了一个无限循环。

我的想法是创建一个递归方法来检查具有较少子节点的最大值。

这是我的代码,但正如我所说,我不知道为什么要创建一个无限循环。

export const checkMaximumChildren = (hierarchy, maximum) => {
    let hasMoreThanMaximumChildren = false;

    if (hierarchy.children.length > maximum) {
        hasMoreThanMaximumChildren = true;
    } else {
        const dmaExtractor = (children) => {
            children.forEach((child) => {
                if (child.children.length > maximum) {
                    hasMoreThanMaximumChildren = true;
                    return hasMoreThanMaximumChildren;
                }

                if (
                    child &&
                    child.children &&
                    Array.isArray(child.children) &&
                    child.children.length > 0
                ) {
                    dmaExtractor(data.children);
                }
            });
        };

        if (
            hierarchy &&
            hierarchy.children &&
            Array.isArray(hierarchy.children) &&
            data.children.length > 0
        ) {
            dmaExtractor(hierarchy.children);
        }
    }

    return hasMoreThanMaximumChildren;
};

 const data =  [{
    "id": 1,
    "parentId": null,
    "selected": false,
    "children": [{
        "id": 2,
        "parentId": 1,
        "selected": false,
        "children": [{
            "id": 3,
            "parentId": 2,
            "selected": false,
            "children": [{
                "id": 4,
                "parentId": 3,
                "selected": false,
                "children": []
            }]
        }]
    }]
 }, {
    "id": 1,
    "parentId": null,
    "selected": true,
    "children": []
 }, {
    "id": 1,
    "parentId": null,
    "selected": true,
    "children": []
 }]

编辑

对不起,我很笨......

dmaExtractor(数据.children);由 dmaExtractor(child.children);

【问题讨论】:

  • (offtopic) branchs 是什么意思?我们应该如何测试您的代码?
  • 分支是一个层次结构

标签: javascript recursion


【解决方案1】:

请看下面的代码:

export const checkMaximumChildren = (hierarchy, maximum) => {
    let hasMoreThanMaximumChildren = false;

    if (hierarchy.children.length > maximum) {
        hasMoreThanMaximumChildren = true;
    } else {
        const dmaExtractor = (children) => {
            children.forEach((child) => {
                if (child.children.length > maximum) {
                    hasMoreThanMaximumChildren = true;
                    return hasMoreThanMaximumChildren;
                }

                if (
                    child &&
                    child.children &&
                    Array.isArray(child.children) &&
                    child.children.length > 0
                ) {
                    return dmaExtractor(data.children); // change #1
                }
            });
        };

        if (
            hierarchy &&
            hierarchy.children &&
            Array.isArray(hierarchy.children) &&
            data.children.length > 0
        ) {
            hasMoreThanMaximumChildren = dmaExtractor(hierarchy.children); // change #2
        }
    }

    return hasMoreThanMaximumChildren;
};

您的无限循环背后的原因可能是因为内部 dmaExtractor 方法没有返回任何内容。

我在开发控制台的文档 DOM 节点上对此进行了测试:

【讨论】:

    【解决方案2】:

    也许我在这里遗漏了一些重要的东西,但为什么不编写一个递归函数来计算层次结构中的节点数,然后用一个函数包装它以确定这是否不大于最大值?

    即:

    const countKids = (data = []) => 
      data .reduce ((total, node) => total + 1 + countKids (node .children || []), 0)
    
    const checkMaximumChildren = (hierarchy, maximum) => 
      countKids (hierarchy) <= maximum
    
    const data = [{id: 1, parentId: null, selected: false, children: [{id: 2, parentId: 1, selected: false, children: [{id: 3, parentId: 2, selected: false, children: [{id: 4, parentId: 3, selected: false, children: []}]}]}]}, {id: 1, parentId: null, selected: true, children: []}, {id: 1, parentId: null, selected: true, children: []}]
    
    console .log (countKids (data) )
    console .log (checkMaximumChildren (data, 5))
    console .log (checkMaximumChildren (data, 10))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      相关资源
      最近更新 更多