サイトアイコン KOKENSHAの技術ブログ

Node.jsで、pathを持っているファイル名配列を Tree構造のjsonに変換する方法

目次

ことの始まり

例えばこんな配列があります

[
'/aaa/bbb/file.txt',
'/aaa/bbb/ccc/file2.text',
'/aaa/vvv/mmm/file3.text',
'/ddd/ccc/file4.text',
'/ddd/ccc/file5.text'
]

これを、そのDirectory構造をそのまま反映するjsonのツリー構造にしたい場合がありますね!(きっとある!)

その時は、下記のプログラムで変換できちゃいます!

JavaScriptプログラム

このファイルを「flat2path2jsontree.js」とします。

var _ = require('lodash');
var paths = [
    '/FolderC/FolderA/FolderQ/ItemA',
    '/FolderC/FolderA/Item1',
    '/FolderD/FolderF/FolderM/ItemA',
    '/FolderD/FolderF/FolderM/ItemB',
    '/FolderD/FolderG/ItemD',
    '/ItemInRoot'
];

function pathString2Tree(paths, cb) {
    var tree = [];

    //ループする!
    _.each(paths, function (path) {
        // currentLevelを rootに初期化する
        var pathParts = path.split('/');
        pathParts.shift();
        // currentLevelを rootに初期化する
        var currentLevel = tree;

        _.each(pathParts, function (part) {

            // pathが既存しているかどうかをチェックする
            var existingPath = _.find(currentLevel, {
                name: part
            });

            if (existingPath) {
                // Pathはすでにツリー構造に入っているので、追加しない
                // current levelを下の子供階層に設定し直す
                currentLevel = existingPath.children;
            } else {
                var newPart = {
                    name: part,
                    children: [],
                }

                currentLevel.push(newPart);
                currentLevel = newPart.children;
            }
        });
    });

    cb(tree);
}
pathString2Tree(paths, function (tree) {
    console.log('tree: ', JSON.stringify(tree));
});

これを実行する前に、下記の操作も忘れないでくださいね。

npm install lodash --save

実行

それから

node flat2path2jsontree.js

これを実行した結果

ちょっと分かりやすいとは言えないですね。

jsonを整形してみましょう。

https://jsonformatter.curiousconcept.com/   (このサイトの信頼性を保証することでも推薦することでもありません、自己責任でご利用ください。)

ちょっとここにコピーして、整形しましょう。

補正

お!{“tree”:”ほんにゃらら”}の形を期待しているんですね、それが正しいです。

ちょっと補正してあげます。

そうすると、綺麗なツリー構造になりました!

もちろん、これをプログラムを修正すれば、できます!

そのやり方は皆さんの練習として、やってみてください!笑

まとめ

node.jsでtree構造のjsonファイルを作る時は

これを参考してできますね!

プログラムはこちらで、公開しました!ご参照ください。

See the gist on github.

他の言語も同じような原理で作ることができるはずです!

興味のある方はぜひやってみてください!

 

 

[amazonjs asin=”B01N2Y16BQ” locale=”JP” title=”JavaScriptエンジニアのためのNode.js入門”]

[amazonjs asin=”4873116066″ locale=”JP” title=”Nodeクックブック”]

モバイルバージョンを終了