javascript函数递归内部数组值存储

securite 2017-07-11 12:08:00
如下代码所示,我想通过递归的方法将文件夹中所有的子文件夹内的文件路径显示出来。
当然,使用WScript.Echo在中间过程打印值没有任何问题,但是想将值存储到数组中返回,发现什么都没有。我估计是跟作用域和上下文有关,但是不知道该怎么解决。目前用了一个非常笨拙的办法就是把这些东西输出到一个指定文件中然后我再读取,时间太长。还有这个其实是微软的jscript,改路径之后可以直接双击运行,或者在命令行用CScript。

var folderPath = 'E:\PARTS_RESULTS';
fp(folderPath);
function fp(folderspec)
{
var fso, folderObject, fileObject, folderEnum, fileEnum
fso = new ActiveXObject("Scripting.FileSystemObject");
folderObject = fso.GetFolder(folderspec);
folderEnum = new Enumerator(folderObject.SubFolders);
fileEnum = new Enumerator(folderObject.Files)

var i1 = 0;
var filePath = new Array();
for (; !fileEnum.atEnd(); fileEnum.moveNext()){
filePath[i1] = fileEnum.item();
// WScript.Echo(filePath[i1]);
i1 += 1;

}

var folderPath = new Array();
// var i;
// i = 0
for (; !folderEnum.atEnd(); folderEnum.moveNext()){
fp(folderEnum.item());
}
// return(filePath);
return(filePath);
}
...全文
241 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
天际的海浪 2017-07-12
  • 打赏
  • 举报
回复
apply方法的作用之一就是可以把一个数组拆解开来,把数组的各个元素分别传递给函数内对应位置的参数中。 如 ar.push.apply(ar, [7,8,9]); 相当于 ar.push(7,8,9);
securite 2017-07-11
  • 打赏
  • 举报
回复
引用 1 楼 jslang 的回复:

var folderPath = 'E:\PARTS_RESULTS';
fp(folderPath);
function fp(folderspec)
{
   var fso, folderObject, fileObject, folderEnum, fileEnum
   fso = new ActiveXObject("Scripting.FileSystemObject");
   folderObject = fso.GetFolder(folderspec);
   folderEnum = new Enumerator(folderObject.SubFolders);
   fileEnum = new Enumerator(folderObject.Files)
   
   var filePath = new Array();
   for (; !fileEnum.atEnd(); fileEnum.moveNext()){
	   filePath.push(fileEnum.item());
   }
   for (; !folderEnum.atEnd(); folderEnum.moveNext()){
		filePath.push.apply(filePath, fp(folderEnum.item()));
   }
   return(filePath);
}

大神,我再对apply的试验中发现有个有趣的现象,如果利用apply方法,实际效果其实相当于把arr拆分开了。这是为什么呢?
var ar = new Array();
ar.push(3);
ar.push(4);
var arr = new Array();
arr.push(9);
arr.push(20);
ar.push.apply(ar, arr);
WScript.Echo(ar);             //3, 4, 9, 10
WScript.Echo(ar.length);    //4
ar.push(arr);                  
WScript.Echo(ar);             //3, 4, [9, 10]
WScript.Echo(ar.length);    //3
;
securite 2017-07-11
  • 打赏
  • 举报
回复
引用 1 楼 jslang 的回复:

var folderPath = 'E:\PARTS_RESULTS';
fp(folderPath);
function fp(folderspec)
{
   var fso, folderObject, fileObject, folderEnum, fileEnum
   fso = new ActiveXObject("Scripting.FileSystemObject");
   folderObject = fso.GetFolder(folderspec);
   folderEnum = new Enumerator(folderObject.SubFolders);
   fileEnum = new Enumerator(folderObject.Files)
   
   var filePath = new Array();
   for (; !fileEnum.atEnd(); fileEnum.moveNext()){
	   filePath.push(fileEnum.item());
   }
   for (; !folderEnum.atEnd(); folderEnum.moveNext()){
		filePath.push.apply(filePath, fp(folderEnum.item()));
   }
   return(filePath);
}

感谢大神,感觉涉及到了作用域之类的东西,基础不足,还得好好补补。push方法尤为精妙!
天际的海浪 2017-07-11
  • 打赏
  • 举报
回复
或者用全局变量保存数组

var folderPath = 'E:\PARTS_RESULTS';

var filePath = new Array();

fp(folderPath);

WScript.Echo(filePath);

function fp(folderspec)
{
   var fso, folderObject, fileObject, folderEnum, fileEnum
   fso = new ActiveXObject("Scripting.FileSystemObject");
   folderObject = fso.GetFolder(folderspec);
   folderEnum = new Enumerator(folderObject.SubFolders);
   fileEnum = new Enumerator(folderObject.Files)
   
   for (; !fileEnum.atEnd(); fileEnum.moveNext()){
	   filePath.push(fileEnum.item());
   }
   for (; !folderEnum.atEnd(); folderEnum.moveNext()){
		fp(folderEnum.item());
   }
}

天际的海浪 2017-07-11
  • 打赏
  • 举报
回复

var folderPath = 'E:\PARTS_RESULTS';
fp(folderPath);
function fp(folderspec)
{
   var fso, folderObject, fileObject, folderEnum, fileEnum
   fso = new ActiveXObject("Scripting.FileSystemObject");
   folderObject = fso.GetFolder(folderspec);
   folderEnum = new Enumerator(folderObject.SubFolders);
   fileEnum = new Enumerator(folderObject.Files)
   
   var filePath = new Array();
   for (; !fileEnum.atEnd(); fileEnum.moveNext()){
	   filePath.push(fileEnum.item());
   }
   for (; !folderEnum.atEnd(); folderEnum.moveNext()){
		filePath.push.apply(filePath, fp(folderEnum.item()));
   }
   return(filePath);
}

87,994

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧