基于文件路径字符串创建对象

Create an object based on file path string

本文关键字:路径 字符串 创建对象 文件 于文件      更新时间:2023-09-26

给定路径"documents/settings/user"

如何将其制成嵌套对象

结果

{
   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-?]] = {};
}

使用.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)

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

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'
    }
  }
}

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

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)