首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript递归奇数行为?

JavaScript递归奇数行为?
EN

Stack Overflow用户
提问于 2016-07-05 20:02:12
回答 1查看 39关注 0票数 2

我很难理解为什么我用JavaScript编写的递归函数有问题。当我给它提供一个大的json文件时,它会陷入一个没完没了的循环。我有一种感觉,它与JavaScript闭包的工作方式有关。跳转某个聪明的人可以查看我的代码并解释正在发生的事情。

我已经将函数行移植到PHP,它产生了我期望的输出。

JavaScript:

代码语言:javascript
复制
var jsonfile = process.argv[2];

json = require("./"+jsonfile);

path = "2";

buildPaths(json, path);

function buildPaths(json, path) {

    if (json.Children == null || json.Children.length == 0) {

        console.log(path + "/" + json.TypedItemId);

    } else {

        for (i = 0; i < json.Children.length; i++) {
            buildPaths(json.Children[i], path + "/" + json.TypedItemId);
        }
    }

}

移植到PHP:

代码语言:javascript
复制
<?php
$jsonfile = $argv[1];
$json = json_decode(file_get_contents($jsonfile));

$path = "2";

buildPaths($json, $path);

function buildPaths($json, $path) {


    if ($json->Children == null || count($json->Children) == 0) {

        echo $path . "/" . $json->TypedItemId . "\n";

    } else {

        for ($i = 0; $i < count($json->Children); $i++) {
            buildPaths($json->Children[$i], $path . "/" . $json->TypedItemId);
        }
    }

}

用于测试的示例JSON文件(更大的文件会导致更多的异常):

代码语言:javascript
复制
{
  "TypedItemId": 4,
  "Children": [
    {
      "TypedItemId": 67,
      "Children": [
        {
          "TypedItemId": 90,
          "Children": [
            {
              "TypedItemId": 90,
              "Children": [
                {
                  "TypedItemId": 67,
                  "Children": [
                    {
                      "TypedItemId": 90,
                      "Children": [
                        {
                          "TypedItemId": 90,
                          "Children": []
                        },
                        {
                          "TypedItemId": 908,
                          "Children": []
                        }
                      ]
                    },
                    {
                      "TypedItemId": 908,
                      "Children": [
                        {
                          "TypedItemId": 90,
                          "Children": []
                        },
                        {
                          "TypedItemId": 908,
                          "Children": []
                        }
                      ]
                    }
                  ]
                }
              ]
            },
            {
              "TypedItemId": 908,
              "Children": []
            }
          ]
        },
        {
          "TypedItemId": 908,
          "Children": [
            {
              "TypedItemId": 90,
              "Children": []
            },
            {
              "TypedItemId": 908,
              "Children": []
            }
          ]
        }
      ]
    }
  ]
}

PHP输出(正确):

代码语言:javascript
复制
2/4/67/90/90/67/90/90
2/4/67/90/90/67/90/908
2/4/67/90/90/67/908/90
2/4/67/90/90/67/908/908
2/4/67/90/908
2/4/67/908/90
2/4/67/908/908

JavaScript节点输出(不正确):

代码语言:javascript
复制
2/4/67/90/90/67/90/90
2/4/67/90/90/67/90/908
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-05 20:08:01

除了在循环中使用的迭代器之外,您的JavaScript没有任何问题:

代码语言:javascript
复制
for (i = 0; i < json.Children.length; i++) {

不是使用var声明局部变量,而是使用全局对象上的属性i作为迭代器,它在buildPaths的所有调用之间共享。

使用局部变量代替:

代码语言:javascript
复制
for (var i = 0; i < json.Children.length; i++) {

你自己试试看:

代码语言:javascript
复制
var json = {"TypedItemId":4,"Children":[{"TypedItemId":67,"Children":[{"TypedItemId":90,"Children":[{"TypedItemId":90,"Children":[{"TypedItemId":67,"Children":[{"TypedItemId":90,"Children":[{"TypedItemId":90,"Children":[]},{"TypedItemId":908,"Children":[]}]},{"TypedItemId":908,"Children":[{"TypedItemId":90,"Children":[]},{"TypedItemId":908,"Children":[]}]}]}]},{"TypedItemId":908,"Children":[]}]},{"TypedItemId":908,"Children":[{"TypedItemId":90,"Children":[]},{"TypedItemId":908,"Children":[]}]}]}]};

var path = "2";

buildPaths(json, path);

function buildPaths(json, path) {
    if (json.Children == null || json.Children.length == 0) {
        console.log(path + "/" + json.TypedItemId);
    } else {
        for (var i = 0; i < json.Children.length; i++) {
            buildPaths(json.Children[i], path + "/" + json.TypedItemId);
        }
    }
}

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38211767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档