使用NodeJS按属性对嵌套的JSON进行排序

时间:2015-07-29 11:51:42

标签: javascript json node.js

假设我有这样的目录结构:

root
|_ .git
|_ .sass-cache
|_ css
|  |_ scss
|  |  |_ modules
|  |  |  |_ a-module.scss
|  |  |  |_ ...
|  |  |_ partials
|  |  |  |_ a-partial.scss
|  |  |  |_ ...
|  |  |_ main.scss
|  |_ main.css
|  |_ main.css.map

...

|_ .bowerrc
|_ .gitignore
|_ app.js
|_ bower.json
|_ Gruntfile.js
|_ index.html
|_ package.json
|_ README.md

我正在使用以下代码生成此结构的JSON,但它还没有维护我想要的顺序,如上所示,文件夹位于列表顶部(按字母顺序排列),文件正在位于列表底部(也按字母顺序排列)。

var fs = require('fs');
var path = require('path');

function getTree(filepath) {

    filepath = path.normalize(filepath);

    var stats = fs.lstatSync(filepath);
    var info = {
        path: filepath,
        name: path.basename(filepath)
    };

    if (stats.isDirectory()) {
        info.type = "directory";
        info.children = fs.readdirSync(filepath).map(function(child) {
            return getTree(path.join(filepath, child));
        });
    } else {
        info.type = "file";
    }
    return info;
}

exports.getTree = getTree;

(从this回复修改)

以下列格式吐出JSON:

{
    path: '/absolute/path/to/directory',
    name: 'name-of-dir',
    type: 'directory',
    children:
        [
            {
                path: '/absolute/path/to/file',
                name: 'name-of-file',
                type: 'file',
            },
            {
                path: '/absolute/path/to/directory',
                name: 'name-of-dir',
                type: 'directory',
                children:
                    [
                        {
                            ...
                        }
                    ]
            }
        ]
}

我想知道如何最好地改变现有代码以对children数组进行排序以复制目录结构顺序。检查应使用nametype属性来确定其在结果JSON中的位置。

非常感谢

1 个答案:

答案 0 :(得分:2)

使用Array.prototype.sort

    info.children = fs.readdirSync(filepath).map(function(child) {
        return getTree(path.join(filepath, child));
    });

    info.children.sort( function(a,b) {
        // Directory index low file index
        if (a.type === "directory" && b.type === "file") return -1;
        if (b.type === "directory" && a.type === "file") return 1;

        return a.path.localeCompare(b.path);
    });