Skip to content

Instantly share code, notes, and snippets.

@marianboda
Created January 17, 2015 02:14
Show Gist options
  • Save marianboda/0f835af4e2ecc0eefbc9 to your computer and use it in GitHub Desktop.
Save marianboda/0f835af4e2ecc0eefbc9 to your computer and use it in GitHub Desktop.
a =
name: 'n1'
items: [
{
name: 'n1.1'
items: [
{name: 'n1.1.1', items: []}
{
name: 'n1.1.2', items: [
{ name: 'n1.1.2.1', items: []}
{ name: 'n1.1.2.2', items: []}
]
}
{name: 'n1.1.3', items: []}
]
}
{
name: 'n1.2'
items: [
{name: 'n1.2.1', items: []}
{name: 'n1.2.2', items: []}
{name: 'n1.2.3', items: []}
]
}
{
name: 'n1.3'
items: [
{name: 'n1.3.1', items: []}
{name: 'n1.3.2', items: []}
{name: 'n1.3.3', items: []}
]
}
]
Path = sep: '/'
dirs = [
{path:'/root'}
{path:'/root/etc'}
{path:'/root/bin'}
{path:'/root/bin/sranda/nieco'}
{path:'/root/var'}
{path:'/root/user'}
{path:'/root/user/mario'}
{path:'/root/user/peto/Home'}
{path:'/root/user/peto/Home/Download'}
{path:'/root/user/peto/Home/Srandy'}
{path:'/root/user/peto/Home'}
{path:'/root/user/miro/este vacsie srandy'}
{path:'/root/user'}
{path:'/root/zzz'}
{path:'/root'}
]
buildTree = (objects, pathField, sep, keyField, valueField, itemsField) ->
objects = _.sortBy(objects, 'path')
sep ?= Path.sep
keyField ?= 'key'
valueField ?= 'value'
itemsField ?= 'items'
pathField ?= 'path'
tree = {}
tree[keyField] = 'root'
tree[itemsField] = []
for o in objects
pathParts = o.path.split(sep)
pathParts.shift() if pathParts[0] is ''
current = tree
for p, i in pathParts
console.log 'ppp '+p
found = _.find current[itemsField], (item) ->
item[keyField] is p
unless found?
newNode = if i is pathParts.length-1 then _.extend(o,{}) else {}
newNode[keyField] = p
newNode[itemsField] = []
current[itemsField].push newNode
found = newNode
current = found
current = _.extend(o, current)
console.log current
# console.log 'found',found
tree
console.log buildTree(dirs)
# console.log dirs
getNode = (tree, path, keyField, itemsField) ->
itemsField ?= 'items'
keyField ?= 'key'
pathParts = if Array.isArray(path) then path else path.split(Path.sep)
pathParts.shift() if pathParts[0] is ''
pathParts.shift() if pathParts[0] is tree[keyField]
getSubtree = (tree, path) ->
found = _.find tree[itemsField], (item) -> item[keyField] is path[0]
if found? and path.length > 1
found = getSubtree(found, path[1..])
found
getSubtree(tree,pathParts)
traversePost = (node, callback, itemsField) ->
itemsField ?= 'items'
if node[itemsField]?.length > 0
traversePost(sub, callback) for sub in node[itemsField]
callback node
traverse = (node, callback, itemsField) ->
itemsField ?= 'items'
if node[itemsField]?.length > 0
traverse(sub, callback) for sub in node[itemsField]
callback node
transform = (node, callback, itemsField) ->
newTree = _.cloneDeep node
traverse(newTree, callback, itemsField)
newTree
transformPost = (node, callback, itemsField) ->
newTree = _.cloneDeep node
traversePost(newTree, callback, itemsField)
newTree
newTree = transform a, (item) ->
item.name = 'item '+item.name
item.count = item.items.length + item.items.reduce (prev, current) ->
prev + (current.count ? 0)
,0
# console.log item.count
# console.log 'newTree', newTree
# console.log 'oldTree', a
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment