2013-05-23 4 views
1

Итак, я пытаюсь использовать github api и конвертировать его для использования в dynatree.Javascript: преобразовать строковый путь в отформатированный массив

Я ищу, чтобы использовать javascript. Но если это проще сделать в Ruby, ClojureScript и т. Д., Это может сработать.

Так Github апи возвращает то, что выглядит как:

{ 
"sha": "a1f28431d5ee1a00361ff7e1e2dc91172d5bbabd", 
"url": "https://api.github.com/repos/Jonovono/c/git/trees/a1f28431d5ee1a00361ff7e1e2dc91172d5bbabd", 
"tree": [ 
{ 
    "mode": "100644", 
    "type": "blob", 
    "sha": "b81f704ee24f08f5f3e00675a9912da79274c3bc", 
    "path": ".gitignore", 
    "size": 114, 
    "url": "https://api.github.com/repos/Jonovono/c/git/blobs/b81f704ee24f08f5f3e00675a9912da79274c3bc" 
    }, 
    { 
    "mode": "100644", 
    "type": "blob", 
    "sha": "c6231c2f161f50bededaaac624a7a96db6179e9a", 
    "path": "Makefile.am", 
    "size": 40, 
    "url": "https://api.github.com/repos/Jonovono/c/git/blobs/c6231c2f161f50bededaaac624a7a96db6179e9a" 
    }, 
    { 
    "mode": "100644", 
    "type": "blob", 
    "sha": "ca41e5b8fb710b4ae7a2cdb35cdbafb143382dc2", 
    "path": "README.md", 
    "size": 2194, 
    "url": "https://api.github.com/repos/Jonovono/c/git/blobs/ca41e5b8fb710b4ae7a2cdb35cdbafb143382dc2" 
}, 
{ 
    "mode": "100644", 
    "type": "blob", 
    "sha": "dd3b02c5fcf3312ef7a83f4b6370a8b546739bc1", 
    "path": "config.h.in", 
    "size": 625, 
    "url": "https://api.github.com/repos/Jonovono/c/git/blobs/dd3b02c5fcf3312ef7a83f4b6370a8b546739bc1" 
}, 
{ 
    "mode": "100644", 
    "type": "blob", 
    "sha": "e242df0dc8be1fec7b2da2091ab8161aaee1b7a2", 
    "path": "configure.ac", 
    "size": 156, 
    "url": "https://api.github.com/repos/Jonovono/c/git/blobs/e242df0dc8be1fec7b2da2091ab8161aaee1b7a2" 
}, 
{ 
    "mode": "100755", 
    "type": "blob", 
    "sha": "df8eea7e4ce8862105fcd7929b20bdb45488048b", 
    "path": "depcomp", 
    "size": 18615, 
    "url": "https://api.github.com/repos/Jonovono/c/git/blobs/df8eea7e4ce8862105fcd7929b20bdb45488048b" 
}, 
{ 
    "mode": "100755", 
    "type": "blob", 
    "sha": "6781b987bdbcbc23efe6bbe1654a1e3637b9af07", 
    "path": "install-sh", 
    "size": 13663, 
    "url": "https://api.github.com/repos/Jonovono/c/git/blobs/6781b987bdbcbc23efe6bbe1654a1e3637b9af07" 
}, 
{ 
    "mode": "100755", 
    "type": "blob", 
    "sha": "28055d2ae6f2a2c584afcd769d7881e11f62ecd9", 
    "path": "missing", 
    "size": 11419, 
    "url": "https://api.github.com/repos/Jonovono/c/git/blobs/28055d2ae6f2a2c584afcd769d7881e11f62ecd9" 
}, 
{ 
    "mode": "040000", 
    "type": "tree", 
    "sha": "57bb4a62d2de582c74b2e6de71e3024db7905cac", 
    "path": "src", 
    "url": "https://api.github.com/repos/Jonovono/c/git/trees/57bb4a62d2de582c74b2e6de71e3024db7905cac" 
}, 
{ 
    "mode": "100644", 
    "type": "blob", 
    "sha": "daaed524883bd510502834d472e9be6cff4e3a69", 
    "path": "src/Makefile.am", 
    "size": 59, 
    "url": "https://api.github.com/repos/Jonovono/c/git/blobs/daaed524883bd510502834d472e9be6cff4e3a69" 
}, 
{ 
    "mode": "100644", 
    "type": "blob", 
    "sha": "cf3f8f549fe870315eb4417c9f84dec587c8286b", 
    "path": "src/c.c", 
    "size": 9480, 
    "url": "https://api.github.com/repos/Jonovono/c/git/blobs/cf3f8f549fe870315eb4417c9f84dec587c8286b" 
} 
] 
} 

Поэтому в основном я хочу, чтобы все пути, которые находятся в массиве, как «Makefile.am», «Src» (понятно, что это папка), «src/cc». Это будет работать и для рекурсивных папок.

Формат, который dynatree выглядит следующим образом:

var obj = [ 
    { title: 'Lazy node 1', isLazy: true }, 
    { title: 'Lazy node 2', isLazy: true }, 
    { title: 'Folder node 3', isFolder: true, 
     children: [ 
     { title: 'node 3.1' }, 
     { title: 'node 3.2', 
      children: [ 
      { title: 'node 3.2.1' }, 
      { title: 'node 3.2.2', 
       children: [ 
       { title: 'node 3.2.2.1' } 
       ] 
      } 
      ] 
     } 
     ] 
    } 
    ]; 

ИЛИ

var rootNode = $("#tree").dynatree("getRoot"); 
    var childNode = rootNode.addChild({ 
    title: "Programatically addded nodes", 
    tooltip: "This folder and all child nodes were added programmatically.", 
    isFolder: true 
    }); 
    childNode.addChild({ 
    title: "Document using a custom icon", 
    icon: "customdoc1.gif" 
    }); 

Я не уверен, какой из них будет легче добраться. Я думаю, что я мог бы использовать какую-либо хэш-таблицу, но я просто не уверен, как заставить ее работать рекурсивно для таких файлов, как: «src/a/b/c/index.text»

ответ

6

Вот простое решение которая принимает строку как "/src/hello/world" и добавляет его пути к объекту

files = {}; 
function parseFolder(path){ 
    var cur = files; 
    path.split("/").slice(1).forEach(function(elem){ 
     cur[elem] = cur[elem] || {}; 
     cur = cur[elem]; 
    }); 
} 

Usage будет что-то вроде

parseFolder("/src/stuff/hello"); 
parseFolder("/src/stuff/world"); 
parseFolder("/bin/stuff/world"); 

Вот working jsfiddle

Это не формат, который распознает Dynatree, но вы получаете идею, вместо добавления свойства, которое называется как путь, вы должны нажать объект на массив.

+0

@ Jonovo, как вы думаете, вы можете работать с этим, или вам поможет более полное решение? –

+0

Эй, это хорошо. Сейчас я строю на нем. Когда я буду работать, я добавлю его в качестве комментария и приму свой ответ! Благодарю. – Jonovono

+0

@ Jonovono Я нахожу это интересным, когда вы это понимаете, мне понравится, если вы поделитесь своим кодом, если вы застряли, дайте мне знать и, возможно, я могу вам помочь. –

Смежные вопросы