整数未正确更新

时间:2017-06-09 13:43:37

标签: javascript recursion

我下面有一个相当长的javascript文件,但理解整个文件并不重要,只有' totalItemCount'变量以及如何更新。此代码使用Igloo API递归计算目录中的文件数(该计数存储在totalItemCount var中)。我之前从未使用过Javascript的递归,所以我可能在那里犯了一个错误。由于某种原因,计数增加,然后在javascript控制台中稍后降低,这让我觉得我在某处更新该变量时犯了一个错误(并且它只在几个地方更新但我可以&#t; t找到它)

编辑:我现在更准确地更新了它,但是项目被超额计算或计算不足约10%。我认为最后几次更新可能是问题所在,但我不确定。以下代码已更新:

new ApiClient({
apimethod: 'objects/7f6d706e-6754-e411-b5b8-d4ae5294c399/children/view',
method: 'get',
queryparams: {
    maxcount: 8000,
    startindex: 0,
    includefuturepublished: true
},
onSuccess: function (responseText) 
{
    var result = JSON.parse(responseText);
    var originalObject = result; //first, top-level object
    var totalItemCount = 0; //UPDATED HERE

    console.log(result.response);
    console.log(result.response.items);
    console.log('RESPONSE TITLE: ' + result.response.items[0].title);
    console.log("\n\n\n");
    totalItemCount += parseInt(result.response.totalCount); //UPDATED HERE
    console.log("totalItemCount: " + totalItemCount);

    //Check if object has children and add to totalItemCount accordingly FOR EACH object:

    function getItemsRecursively(totalItemCount1)
    {
        for(var i = 0; i < parseInt(totalItemCount); i++) //at this point, totalCount == #objects at this lvl
        {
            console.log("FOR LOOP TEST: " + i);
            var currentObject = result.response.items[i];
            console.log("href/dir: " + currentObject.href);
            console.log("title: " + currentObject.title);
            console.log("numchildren: " + currentObject.numchildren);
            if(currentObject.numchildren > 0 && currentObject.numchildren != undefined)
            {
                console.log("it has children...");
                getChildrenItemCount(totalItemCount1, currentObject);
            }

            console.log("New totalItemCount: " + totalItemCount);
            console.log("\n~~~~~ NEXT OBJECT ~~~~~\n");
        }
    }

    function getChildrenItemCount(totalItemCount2, previousObject)
    {
        //totalItemCount2 = totalItemCount;
        var childID = previousObject.id;
        console.log("childID: " + childID);
        new ApiClient
        ({
            apimethod: 'objects/' + childID + '/children/view',
            method: 'get',
            queryparams: {
                maxcount: 8000,
                startindex: 0,
                includefuturepublished: true
            },
            onSuccess: function (responseText) 
            {
                console.log("getChildrenItemCount successful...");
                var result = JSON.parse(responseText);
                console.log(result);
                var currentObject = result.response;

                var currentFolderItemCount = currentObject.totalCount;
                console.log("currentFolderItemCount: " + currentFolderItemCount);

                for(var i = 0; i < parseInt(currentFolderItemCount); i++) //at this point, totalCount == #objects at this lvl
                {
                    console.log("CHILDREN FOR LOOP TEST: " + i);
                    var currentObject = result.response.items[i];
                    console.log("href/dir: " + currentObject.href);
                    console.log("title: " + currentObject.title);
                    console.log("numchildren: " + currentObject.numchildren);
                    if(currentObject.numchildren > 0 && currentObject.numchildren != undefined)
                    {
                        console.log("it's children has children...");
                        totalItemCount += parseInt(currentObject.numchildren); //UPDATED HERE
                        totalItemCount2 = totalItemCount; //UPDATED HERE
                        console.log("totalItemCount after one sub-child total: " + totalItemCount);
                        getChildrenItemCount(totalItemCount2, currentObject);
                    }

                    console.log("New totalItemCount after ENTIRE getChildrenItemCount: " + totalItemCount);
                    console.log("\n~~~~~ NEXT OBJECT WITHIN CHILDREN ~~~~~\n");
                    console.log("\n\n\n\nFINAL ITEM COUNT: " + totalItemCount);

                }
            }
        })
        //return totalItemCount;
    }

    getItemsRecursively(totalItemCount);

    console.log("\n\n\n\nFINAL ITEM COUNT: " + totalItemCount);
}

});

1 个答案:

答案 0 :(得分:1)

这是一个“范围”问题,你使用相同的变量名作为函数的参数并输出函数,所以参数会覆盖全局变量。

请参阅以下内容:

var global = 10;

function test(global){
  global += 100;
  console.log(global);
}

console.log(global);
test(global);
console.log(global);

您只需删除var函数的参数。

var global = 10;

function test(){
  global += 100;
  console.log(global);
}

console.log(global);
test(global);
console.log(global);

我希望很清楚,再见。