javascript - Lodash 自动生成 TreeView

标签 javascript node.js algorithm lodash

我想为我的 React 组件自动生成 TreeView 。我有多个文件,它们都有自己的路径。例如:

  • com/company/model/Main.java
  • com/company/controller/Move.java
  • com/company/controller/Rotate.java
  • com/company/view/Watch.java

目标是让对象数据看起来像这样:

var data = {
   name: com,
       children: [{name: company,
                   children: [
                   {name: model,
                     children: [{name: Main.java}]
                   },
                   {name: controller,
                     children: [{name: Move.java},{name: Rotate.java}]
                   },
                   {name: view,
                     children: [{name: Watch.java}]
                   }
                 ]}]
 }

我发现这个库将我的路径拆分为一个选项卡:https://nodejs.org/api/path.html

像这样:

var path = com/company/model/Main.java ;
var dirname = path.dirname(path); // => « com/company/model »
var folders = dirname.split(path.sep); // => folders = [‘com’,’compagny’,’model’]

我尝试使用 lodash https://lodash.com/docs 要自动生成这个但没有成功,你能帮我吗

最佳答案

使用稍作修改的 this answer 版本:

var _ = require('lodash');
var path = require('path');

var paths = [
    'com/company/model/Main.java',
    'com/company/controller/Move.java',
    'com/company/controller/Rotate.java',
    'com/company/view/Watch.java'
];

// build input data from the paths
// {
//     "lvl0": "com",
//     "lvl1": "company",
//     "lvl2": "model",
//     "name": "Main.java",
//     "path": "com/company/model/Main.java"
// }
var data = paths.map(function (el) {
    // var folders = path.dirname(el).split(path.sep);
    var folders = path.dirname(el).split('/');
    var obj = {};
    for (var i = 0; i < folders.length; i++) {
        obj['lvl' + i] = folders[i];
    }
    obj.name = path.basename(el);
    obj.path = el;
    return obj;
});

// add a new function to lodash
_.mixin({
    groupByMulti: function (obj, values, context) {
        if (!values.length) return obj;
        var byFirst = _.groupBy(obj, _.head(values), context);
        for (var prop in byFirst) {
            byFirst[prop] = _.groupByMulti(byFirst[prop], _.tail(values), context);
        }
        byFirst = _.map(byFirst, function (rows, key) {
            return { name: key, children: rows };
        });
        return byFirst;
    }
});

var out = _.groupByMulti(data, ['lvl0', 'lvl1', 'lvl2'])[0];
console.log(JSON.stringify(out, null, 3));

关于javascript - Lodash 自动生成 TreeView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34965395/

相关文章:

python - LUP (PLU) 分解因随机矩阵而失败

javascript - *.default 不是构造函数,带有导入的js插件

Javascript 对象偏执狂(我可以依赖元素的顺序吗)

javascript - Node.js:如何跨模块发送事件

c++ - "factor out"公共(public)字段有什么办法可以节省空间?

database - 如何使用近似查询存储数据?

javascript - 单击一次添加文本以输入

javascript - 防止客户端存储 XMLHttpRequest 文档

javascript - 谷歌地图 JS : How do I get the small tooltip marker on hover AND the normal info window on click?

javascript - 如何设置 ember 引擎?