【问题标题】:Convert Url/Path to Json with Node.js使用 Node.js 将 URL/路径转换为 ​​Json
【发布时间】:2013-07-06 04:22:29
【问题描述】:

我最近构建了一个小节点程序,能够控制台记录精确路径的所有文件。 例如,我从这个函数得到的结果如下所示:

/Volumes/TimeCapsule/movies/movie1
 movie1.mp4
/Volumes/TimeCapsule/movies/movie2
 movie2.mp4
/Volumes/TimeCapsule/movies/movie3
 movie3.mp4

现在我的问题是:如何将每个路径转换为 ​​JSON,以便能够在单个 html 页面中显示电影文件夹的所有文件?

我想要这样的东西:

{ "Volumes": {
             "TimeCapsule": {
                            "Movies":{
                                    "Title": "Movie1"
                                    "Title": "Movie2"
                                    "Title": "Movie3"
                                   }
                            }
           }

}

提前谢谢你。

顺便说一下,这是我的步行功能:

var fs = require('fs');
var walk = function (currentPath) {
 console.log(currentPath);
 var files = fs.readdirSync(currentPath); //Returns array of filename in currenpath
 for (var i in files) {
   var currentFile = currentPath + '/' + files[i];
   var stats = fs.statSync(currentFile);
   if (stats.isFile()) {
   console.log(currentFile.replace(/^.*[\\\/]/, '')););
   }
  else if (stats.isDirectory()) {
         walk(currentFile);
       }
 }
};

【问题讨论】:

    标签: json node.js function path


    【解决方案1】:

    好的,我们开始:

    var fs = require( "fs" );
    function walk( path, arr ) {
        var ret = {};
        arr = Array.isArray( arr ) ? arr : [];
    
        fs.readdirSync( path ).forEach(function( item ) {
            var current = path + "/" + item;
            var stats = fs.statSync( current );
            if ( stats.isFile() ) {
                arr.push( current );
            } else if ( stats.isDirectory() ) {
                walk( current, arr );
            }
        });
    
        arr.forEach(function( item ) {
        var i, len;
            item.split( "/" ).reduce(function( obj, path, i, parts ) {
                if ( ( i + 1 ) === parts.length ) {
                    obj.Title = path;
                } else {
                    obj[ path ] = obj[ path ] || {};
                    return obj[ path ];
                }
            }, ret);
        });
    
        return ret;
    }
    

    这没有经过测试,但也许它会给你一些关于如何做的想法。

    【讨论】:

    • 感谢您的帮助,我会试试看!
    • 看起来可行,但我有一个问题。您的 walk 函数仅将它找到的第一个文件放入标题部分,然后浏览另一个文件夹。我无法获得文件夹的全部内容,但我会简单地为我的项目添加一些限制(例如仅将 .mp4 文件放入一个文件夹中,仅此而已)谢谢您的帮助!
    • 我没有得到我想要的,这里有一个例子:{ Volume{}, timeCapsule{}, movies{}, movie1{ Title: 'movie1.mp4'} }
    • 好的,我已经更新了答案。看看新代码是否符合您的要求:)
    • 几乎是的,我会尝试修复您的代码,因为它说类似 { '': { Volumes: { timeCapsule: [Object] } } }
    【解决方案2】:

    这是我真正想要的,我什至添加了一个路径部分,这样我就可以访问每个文件的路径:

    var fs = require('fs'),
        path = require('mypath')
    
     function walk(path) {
         var stats = fs.lstatSync(mypath),
           info = {
            path: mypath,
            Title: path.basename(mypath)
        };
    
    if (stats.isDirectory()) {
        info.type = "folder";
        info.children = fs.readdirSync(filename).map(function(child) {
            return walk(mypath + '/' + child);
        });
    } else {
        info.type = "file";
    }
    
    return info;
    }
    
    
    console.log(walk('/Users/maximeheckel/Desktop'));
    

    感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-20
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 2011-05-25
      • 1970-01-01
      相关资源
      最近更新 更多