JSA里使用Dir实现文件递归


//开始遍历的文件目录
function getfolderPath(){
	return String.raw `H:\视频\动漫\航海王(海贼王)`;	
}

//在B列写入遍历到的文件
function writeArr(fileArr){
	Columns(2).Value2 = null;				//清空B列
	fileArr = fileArr.map(path => [path]);	//套一层数组
	Range("B1").Resize(fileArr.length,fileArr[0].length).Value2 = fileArr;	//写入B列
}

//取得文件(不含文件夹)
function demoA(){
	var fileArr = getFiles(getfolderPath());		//不使用第2参数,不会返回遍历到的文件目录
	writeArr(fileArr);
}

//取得文件与文件目录
function demoB(){
	var fileArr = getFiles(getfolderPath(), true);	//起始文件目录
	
	fileArr = layer(fileArr);	//层次感
	writeArr(fileArr);
}



//取得文件目录(文件夹)
function demoC(){
	var fileArr = getFiles(getfolderPath(), true);	//使用第二参数,返回遍历到的文件夹
	fileArr = fileArr.filter(path => GetAttr(path) == jsDirectory);	//筛选文件目录
	
	fileArr = layer(fileArr);	//层次感
	writeArr(fileArr);
}













//搞个层次感,去掉最后一个斜杠之前的路径,只保留文件名或者文件目录
function layer(fileArr){
	var pattern = /\\|\//g;	//正则对象
	var startLen = fileArr[0].match(pattern).length + 1;	//斜杠数量加1
	
	return fileArr.map(path => {
		let texts = path.split(pattern)
		return "  ".repeat(texts.length - startLen) + texts.pop();
	});
}





/*递归遍历文件与文件夹
 *@param 	folderPath		开始遍历的文件目录(作为根目录),会作为返回数组的第0个元素,如果文件目录不存在,则会抛出一个错误
 *@param	isReturnFolders	布尔值,true表示返回遍历到的文件目录,默认为false
 *@return					返回一个数组,元素为遍历到的所有文件的绝对路径
 */
function getFiles(folderPath, isReturnFolders = false) {
	function getNext(path) {
		let fileName = Dir(path + "\\*", jsDirectory);//初始化Dir环境为查找全部文件(文件夹与文件);jsDirectory = 16
		let recordArr = [];		//记录当前文件夹遍历到的全部文件
		while(fileName != ""){
			if(fileName != "." && fileName != ".."){	//排除"."与".."	
				recordArr.push(path + "\\" + fileName);	//记录文件绝对路径
			}
			
			fileName = Dir();	//下一个文件
		}
		while(recordArr.length != 0){				//递归停止条件
			let shiftPath = recordArr.shift();		//弹出首个路径(队列顺序)
			fileArr.push(shiftPath);
			if(GetAttr(shiftPath) == jsDirectory){	//如果是一个文件目录,则进行递归
				!isReturnFolders && fileArr.pop();	//是否不保存遍历到的文件目录
				getNext(shiftPath);
			}
		}
	}
	
	if(Dir(folderPath, jsDirectory) == ""){
		throw new Error("【" + folderPath + "】文件夹路径不存在")
	}
	
	folderPath = folderPath.replace(/(\\|\/)$/, "");	//去除最后一个正斜杠或者反斜杠(如果存在的话)
	var fileArr = [folderPath];	//存放遍历到的所有文件,首先保存遍历的根目录
	getNext(folderPath);		//开始遍历
	return fileArr;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 可以使用归函数实现深拷贝,具体实现方法可以参考以下代码: function deepClone(obj) { if (typeof obj !== 'object' || obj === null) { return obj; } let result = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { result[key] = deepClone(obj[key]); } } return result; } 这个函数可以归地遍历对象或数组的每一个属性,然后进行深拷贝。 ### 回答2: 在JavaScript中,可以通过归函数来实现深拷贝。深拷贝意味着将一个对象的所有属性和子属性都复制到一个新的对象中,使得新的对象与原始对象完全独立,修改新对象不会影响原始对象。下面是一个使用归函数实现深拷贝的示例: ```javascript function deepCopy(obj) { if (typeof obj !== 'object' || obj === null) { return obj; // 如果是基本类型或者null,直接返回 } let cloneObj = Array.isArray(obj) ? [] : {}; // 判断是数组还是对象 for (let key in obj) { if (obj.hasOwnProperty(key)) { // 确保只拷贝对象自身的属性 cloneObj[key] = deepCopy(obj[key]); // 归调用深拷贝函数 } } return cloneObj; // 返回新的拷贝对象 } // 示例: let obj1 = { name: '张三', age: 20, hobbies: ['篮球', '足球', '游泳'], address: { city: '北京', street: '朝阳路' } }; let obj2 = deepCopy(obj1); obj2.name = '李四'; obj2.hobbies.push('乒乓球'); obj2.address.city = '上海'; console.log(obj1); // { name: '张三', age: 20, hobbies: ['篮球', '足球', '游泳'], address: { city: '北京', street: '朝阳路' } } console.log(obj2); // { name: '李四', age: 20, hobbies: ['篮球', '足球', '游泳', '乒乓球'], address: { city: '上海', street: '朝阳路' } } ``` 以上代码定义了一个名为`deepCopy`的函数,它接收一个参数`obj`,首先判断传入的对象类型,如果是基本类型或者null,则直接返回;如果是对象或者数组,创建一个新的空对象或者空数组,然后使用`for...in`循环遍历原始对象的属性,归调用`deepCopy`函数来深拷贝每个属性值,最后返回新的拷贝对象。这样,我们就可以通过归函数实现深拷贝了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豪情云天

您的鼓励就是创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值