繁体   English   中英

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

[英]Recursive function doesn't return all data

我只想列出Drive中特定驱动器的文件夹名称。 因此,我首先调用函数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;

}

我的代码有几个问题,但是首先,最主要的是,您对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对象的扁平数组。 我还更改了varlet关键字成为关键字,因为var是函数范围的关键字,在块内定义此变量没有意义(在这种情况下,您的while循环)

JSFiddle-看看这个小提琴。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM