递归函数不会返回所有数据

时间:2017-09-25 10:35:09

标签: javascript arrays google-apps-script

我想仅列出云端硬盘中特定硬盘的文件夹名称。所以我首先调用函数getFolderNames()并在那里添加父文件夹名称。然后我调用getChildFolders(parent)函数获取所有子文件夹并继续为每个子文件夹递归调用。

我的问题是变量folderatt(应该包含有关文件夹名称的所有信息)只包含第一个文件夹的名称,因此只有父文件夹的子文件夹。但是当我在递归函数中登录时,它会正确显示所有文件夹和子文件夹名称。

function getFolderNames() {
    var folderatt = [];

    try {

        // If you want a tree of any sub folder
        var parent = DriveApp.getFoldersByName("Librari").next();

        var dhenat = getChildFolders(parent);


        folderatt.push(dhenat);

    } catch (e) {

        Logger.log(e.toString());

    }
    return folderatt;

}


function getChildFolders(parent) {
    folderNames = [];

    var childFolders = parent.getFolders();
    var thirr = 1;
    while (childFolders.hasNext()) {


        var childFolder = childFolders.next();
        var allFolders = {};
        allFolders.emri = childFolder.getName();
        allFolders.id = childFolder.getId();

        folderNames.push(allFolders);
        thirr++;
        folderNames.push(thirr);
        // Logger.log(childFolder.getName());
        //    Logger.log(folderNames);


        // Recursive call for any sub-folders
        getChildFolders(childFolder);

    }
    return folderNames;

}

2 个答案:

答案 0 :(得分:1)

我可以在您的代码中看到一些问题,但首先,对于getChildFolders( childFolder )调用的结果,您实际上并没有做任何事情,所以很自然,它不会得到结果集,现在可能你可以把它改成这个

// Recursive call for any sub-folders
folderNames.concat( getChildFolders( childFolder ) );

但是你应该知道,目前你的folderNames变量是一个全局变量(因为它没有真正定义,你只需为它赋值)。只要它是全局的,即使concat也不会帮助你,所以你也必须分配它,例如:

let folderNames = [];

它无效的原因是每次调用getChildFolders函数时,在您的示例中,folderNames将再次设置为空数组,因此folderNames只包含最后一个的结果你打电话给getChildFolders( childFolder )的时间。通过在本地定义,不会有这样的副作用

所以最后,第一个函数可以改写为:

function getChildFolders(parent) {
    let folderNames = [];
    let childFolders = parent.getFolders();
    while (childFolders.hasNext()) {
        let childFolder = childFolders.next();
        let allFolders = {
          emri: childFolder.getName(),
          id: childFolder.getId()
        };
        folderNames.push(allFolders);
        // Recursive call for any sub-folders
        folderNames.concat( getChildFolders( childFolder ) );
    }
    return folderNames;
}

请注意我删除了thirrr变量,因为我不清楚你需要它的目的。

最后,这应该为您提供包含allFolders对象的扁平数组。我还将var更改为let关键字,因为var是一个函数范围的关键字,在块内定义没有意义(在本例中,是你的while循环)< / p>

答案 1 :(得分:1)

JSFiddle - 看看这个小提琴。

在递归函数之外声明并初始化'folderNames'变量。那应该可以解决你的问题。此外,您无需将其返回到父级功能中的'dhenat'变量,因为现在“folderNames'将保留结果