最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Create an object based on file path string - Stack Overflow

programmeradmin6浏览0评论

Given the path "documents/settings/user"

How can this be made into a nested object

Result

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

I can't think of how to reference each previous path

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

Given the path "documents/settings/user"

How can this be made into a nested object

Result

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

I can't think of how to reference each previous path

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-?]] = {};
}
Share Improve this question asked Aug 4, 2016 at 13:28 BarryBones41BarryBones41 1,4911 gold badge15 silver badges31 bronze badges
Add a ment  | 

3 Answers 3

Reset to default 8

This is actually done quite easily with .reduce().

var dir = {}

var paths = "documents/settings/user".split('/')

paths.reduce(function(dir, path) {
  return dir[path] = {}
}, dir)

console.log(dir)

Because the first parameter is always the last value returned (or the first value provided), all we need to do is return the object being assigned to the current path. And because an assignment results in the value being assigned, we can use that as the expression of the return statement itself.


If needed, you can guard against empty path names due to adjacent separators.

var dir = {}

var paths = "documents///settings/user".split('/')

paths.reduce(function(dir, path) {
  return path ? (dir[path] = {}) : dir
}, dir)

console.log(dir)

Yet another elegant solution to build an object with value:

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

For example buildObjWithValue('very.deep.lake', 'Baikal') gives us

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

Objects are passed by reference. You can use this feature and do something like this.

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)

For

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)

发布评论