【问题标题】:Create an object based on file path string根据文件路径字符串创建对象
【发布时间】:2016-08-04 13:28:47
【问题描述】:

给定路径“文档/设置/用户”

如何把它做成嵌套对象

结果

{
   documents : {
         settings : {
               user : {}
          } 
    }
}

我想不出如何引用之前的每条路径

var dir = {};

var paths = "documents/settings/user".split('/')
for (var i = 0; i < paths.length; i++) {
  var path = paths[i];
  if(i === 0)
        dir[path] = {};
  //else
    //dir[path[i-?]] = {};
}

【问题讨论】:

    标签: javascript


    【解决方案1】:

    这实际上很容易通过.reduce() 完成。

    var dir = {}
    
    var paths = "documents/settings/user".split('/')
    
    paths.reduce(function(dir, path) {
      return dir[path] = {}
    }, dir)
    
    console.log(dir)

    因为第一个参数总是返回的最后一个值(或提供的第一个值),所以我们需要做的就是返回分配给当前路径的对象。由于赋值会导致赋值,我们可以将其用作return 语句本身的表达式。


    如果需要,您可以防止由于相邻分隔符而导致的空路径名。

    var dir = {}
    
    var paths = "documents///settings/user".split('/')
    
    paths.reduce(function(dir, path) {
      return path ? (dir[path] = {}) : dir
    }, dir)
    
    console.log(dir)

    【讨论】:

    • 非常优雅的解决方案。使用前只需检查Browser compatibility。你甚至可以为不兼容的浏览器添加polyfill
    • @Rajesh:好点。需要为非常旧的 JS 实现打补丁。
    • 另一个很好的答案。没关系,我在 Node.js 上
    【解决方案2】:

    Objects 通过引用传递。您可以使用此功能并执行类似的操作。

    Array.forEach

    var paths = "documents/settings/user".split('/')
    var r = {};
    var _tmp = r;
    paths.forEach(function(el){
      _tmp[el] = {};
      _tmp = _tmp[el];
    });
    
    console.log(r)

    对于

    var paths = "documents/settings/user".split('/')
    var r = {};
    var _tmp = r;
    for(var i=0; i<paths.length; i++){
      _tmp = (_tmp[paths[i]] = {});
    };
    
    console.log(r)

    【讨论】:

    • 哇...真的很棒。谢谢。
    【解决方案3】:

    另一个优雅的解决方案来构建一个有价值的对象:

    const buildObjWithValue = (path, value = '') => {
        const paths = path.split('.');
        return paths.reduceRight((acc, item, index) => ({
            [item]: index === paths.length - 1
                ? value
                : acc
        }), {});
    }
    

    例如buildObjWithValue('very.deep.lake', 'Baikal')给我们

    {
      very: {
        deep: {
          lake: 'Bailkal'
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-09
      • 2018-03-08
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多