猿问

解析原生 JavaScript 中的路径字符串

我正在尝试将字符串解析为理论上的虚拟路径(全部在客户端创建),使用普通的旧 JavaScript,没有 NodeJS,什么都没有(我尝试创建一个新 URL 或将路径设置为 href 等,但我希望它在网络工作者内部工作)。

基本上,有一个虚拟文件系统,它以 . 开头,"C:/"然后像所有其他路径系统一样下降。假设我得到一个字符串作为输入,例如

"C:/someDir/someOtherDir/someThirdDir/../../folderInSomeDir/fileInFolderInSomeDir.txt"

所以理论上这将访问,正如文件本身的名称所说,文件夹内的文件,该文件夹本身位于名为someDir.

最难处理的部分是该../../部分,因此上面的预期输出字符串将是

"C:/someDir/folderInSomeDir/fileInFolderInSomeDir.txt"

我只是想知道如何准确地处理该../../部分,我尝试拆分字符串/并循环遍历各个部分,确定当前字符串是否等于..,并跟踪当前目录,这将立即在 each 之前..,但我对接下来要做什么以获取输出字符串一无所知。这是我的功能,目前

b.onclick = () => {

  out.innerHTML = resolve(p.value)

};

function resolve(path, basePath = "/") {

                    var pathd = pathify(path)

                    if(basePath != "/") basePath = resolve(basePath)

                    var based = pathify(basePath)

                    var baseDirs = based.split("/")

                    var directs = pathd.split("/")

                    var upDirs = 0

                    var currentDir = ""

                    var numberDirs

          var result

                    directs.forEach((x, i, ar) => {

                        if(x == ".." || i == 0 && x == "") {

                            upDirs++

                        }

                        else {

                            currentDir = x

                        }

                    })

          result = directs.join("/") //what else do I Do?!

                    return result

                }

                

                function pathify(path) {

                    var newPath = ""

                    if(typeof path == "string") {

                        

                        var slashesDoubled = 0,

                            dotsDoubed

                        path.split("").forEach(x => {

                            var isIts = [

                                "\n"

                            ]



GCT1015
浏览 136回答 1
1回答

狐的传说

您可以将其拆分并将其缩减为一个新数组。如果段是.,则忽略它,如果是..从结果中弹出最后一个段,则添加它:const path = "C:/someDir/someOtherDir/someThirdDir/../../folderInSomeDir/fileInFolderInSomeDir.txt";const result = path.split('/')                   .reduce((a, v) => {                     if (v === '.'); // do nothing                     else if (v === '..') a.pop();                     else a.push(v);                     return a;                   }, [])                   .join('/');console.log(result);
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答