[英]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
对象的扁平数组。 我还更改了var
以let
关键字成为关键字,因为var
是函数范围的关键字,在块内定义此变量没有意义(在这种情况下,您的while循环)
JSFiddle-看看这个小提琴。
在递归函数之外声明并初始化'folderNames'
变量。 那应该解决您的问题。 另外,您无需在父功能中将其返回到'dhenat'
变量,因为现在“ folderNames'
将保存结果
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.