Skip to content

Instantly share code, notes, and snippets.

@una
Created January 18, 2015 03:16
Show Gist options
  • Save una/7e33093d51ed2d037433 to your computer and use it in GitHub Desktop.
Save una/7e33093d51ed2d037433 to your computer and use it in GitHub Desktop.
var obj = {
values: null,
children: {
childA: {
values: [A,B],
children: {
subA: {
values: [C],
children: null
}
}
},
childB : {
values: null;
children: {
subB: {
values: null,
children: {
subC: {
values: [C],
children: null
}
}
}
}
}
}
"childA/A.txt"
"childA/B.txt"
"childA/subA/C.txt"
"childB/subB/subC/hello.txt"
//The .txt ending signals that it is a value, not a child of the parent
@drinks
Copy link

drinks commented Jan 18, 2015

var scaffoldPath = function (path, initial) {
  var blankObject = {
    values: null,
    children: null
  };

  initial || (initial = JSON.parse(JSON.stringify(blankObject)));

  var finish = function (val, ref) {
    ref.values && ref.values.push(val) || (ref.values = [val]);
  };

  var parts = path.split('/');
  var val = parts.pop().replace(/\.txt$/, '');

  if (parts.length === 0) {
    finish(val, initial);
  }
  else {
    var ref = parts.reduce(function(accum, part, i) {
      accum.children || (accum.children = {});
      if (typeof accum.children[part] === 'undefined') {
        accum.children[part] = JSON.parse(JSON.stringify(blankObject));
      }
      return accum.children[part];
    }, initial);
    finish(val, ref);
  }
  return initial;
};

var out = scaffoldPath("childA/A.txt");
out = scaffoldPath("childA/B.txt", out);
...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment