【问题标题】:Lodash autogenerate tree viewLodash 自动生成树视图
【发布时间】:2016-01-24 03:52:07
【问题描述】:

我想为我的 react 组件自动生成一个树视图。我有多个文件有自己的路径。例如:

  • 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 要在没有成功的情况下自动生成它,你能帮我吗

【问题讨论】:

    标签: javascript node.js algorithm lodash


    【解决方案1】:

    使用稍加修改的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));
    

    【讨论】:

      猜你喜欢
      • 2018-03-27
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      相关资源
      最近更新 更多