// MySQLDir :: { id :: Number, name :: String, lft :: Number, rgt :: Number } // Directory :: { id :: Number, name :: String, children :: Array Directory } // unflatten :: Array MySQLDir -> Array Directory const unflatten = directories => { if (directories.length === 0) { return []; } const head = directories[0]; const children = directories.filter(dir => dir.lft > head.lft && dir.rgt < head.rgt); const remainder = directories.filter(dir => dir.lft > head.rgt); return [{id: head.id, name: head.name, children: unflatten(children)}] .concat(unflatten(remainder)); };