}
});
}
// 如果是目录则递归调用自身
else if (st.isDirectory()) {
if (obj.length <= 0) {
obj.push({
name: path,
list: [] })
} else {
var value = paths;
async.forEachLimit(obj, 1000, function(item, callback) {
//如果数组里已有
if (src.match(new RegExp(item.name))) {
item.list.push({
name: path,
list: [] })
} else {
value.forEach(function(vv) {
if (vv == item.name) {
obj.push({
name: path,
list: [] })
} else {}
})
}
callback(null, item)
}, function(err) {
if (err) throw err;
})
}
exists(_src, search);
}
});
});
});
};
var exists = function(src, callback) {
callback(src);
};
exists('./test2', search);
})();
提示
首先,要有心理准备,这个轮子里使用了递归+很多遍历,这对于内存占用是很严重的,尤其是我们还有一个 全局变量OBJ ,如果逻辑处理不好很容易会出现错误内存溢出。这也是为什么我引入了async模块的理由。
在引入模块之后,第一步要着眼于判断为文件夹后的函数:
//如果obj为空,说明我们是第一次进入函数,那么插入一个新的元素
if (obj.length <= 0) {
obj.push({
name: path,
list: [] })
}async.forEachLimit是异步串行函数,可以同批次运行指定数量的代码,可以避免一次遍历太多,里面的参数依次为(数组,指定的数量,执行函数,错误回调)。
下面代码中的参数很多,如paths,path,src,_src等,打代码的时候经常会让我头脑不清晰,这也侧面告诫了我一个问题,同一作用域内不宜有太多处理函数。
//如果路径参数src里匹配到了obj中元素的name,说明数组里已经有了上级文件夹,则向此上级文件夹内插入此时的文件夹名path
if (src.match(new RegExp(item.name))) {
item.list.push({
name: path,
list: [] })
} /*如果没有上级文件夹,那往尾部插入新的元素
*进行一次遍历排查,去除掉二级路径向尾部插入的举动*/
value.forEach(function(vv) {
if (vv == item.name) {
obj.push({
name: path,
list: [] })
} else {}
})
对我来说,这段代码是一段丑陋的函数,处理方法过于粗糙,并且占用了不必要的内存空间,更严重的是,拖累了整体文件的运行速度,但时间仓促,加之能力菜的真实,暂时还尚未想出解决方案。
还要备注的是,这里本来想达到的去重判断因为上级方法套用的遍历次序不同,造成我只完成了初级的防止push重复,却又有了递归式的重复。有兴趣的朋友在使用这个demo时可以将首行的去重方法删除,看看效果。









