2015-05-20 4 views
1

У меня есть путь (в виде строки), какКак сформировать вложенный объект JSON из массива?

A/B/C/D

. Я хочу, чтобы представить его в качестве объекта JSON следующим образом:

{ 
    A:{ 
     B:{ 
     C:D 
     } 
    } 
} 

Теперь давайте говорить, что я добавить путь

A/B/C/X

то JSON РЕКОМЕНДУЕМЫМ Посмотрите, как

{ 
    A:{ 
     B:{ 
     C:[D,X] 
     } 
    } 
} 

Так что я делаю, когда я получаю путь, я его разделяю и храню в массив следующим

var struct = {}; 
var path = $scope.path.split("/"); //assuming $scope.path holds the path 
for(var i =0;i<path.length-1;i++) 
    { 
     struct[path[i]] = path[i+1]; 
    } 

Однако это приводит к JSon, как {A: "B", B: "C", C: "D"}. Как это исправить? Есть ли рекурсивный способ сделать это?

EDIT: Моя предыдущая схема приведет к ошибке. Как предположил Кевин Б., я обновляю схему до чего-то типа [{name: 'A', children: [{name: 'B', children: []}]}]

+1

У вас не может быть два идентичных ключа в объекте, поэтому вы никогда не получите 'C: D' и' C: X' в объекте 'B',' C' нужно будет преобразовать в массив '[ D, X] 'или' B', чтобы быть массивом '[{C: D}, {C: X}]' – SmokeyPHP

+0

* «Есть ли рекурсивный способ сделать это?» * Да, перебирать по пути , на каждой итерации на один уровень углубляйтесь в объект, пока не пройдете весь путь. Однако сначала вам нужно придумать схему, которая действительно работает, в предыдущем комментарии. –

+0

Исправил мой вопрос о несоответствии. – Dubby

ответ

1

Да, взгляните на эту функцию которая была создана для этого (я являюсь автором, кстати):

https://github.com/DiegoZoracKy/make-object-path

код:

var makeObjectPath = function(_src, _path, _val) { 

    var src = _src, 
     path = _path, 
     val = _val; 

    if (arguments[0] instanceof Array || typeof(arguments[0]) == 'string') { 
     src = {}; 
     path = arguments[0]; 
     val = arguments[1] || null; 
    } 

    path = (typeof(path) == 'string') ? path.split('.') : path; 

    var o = src; 
    var currentO = o; 
    for (var i in path) { 
     currentO[path[i]] = (i != path.length - 1) ? currentO[path[i]] || {} : (val) ? val : {}; 
     currentO = currentO[path[i]]; 
    } 
    return o; 
} 

И использовать его:

makeObjectPath('root.parent.child', 'someValue'); 

// Output: 

{ 
    "root":{ 
     "parent":{ 
      "child":"someValue" 
     } 
    } 
} 
+0

Но если у меня есть более одного значения слова child или parent, эта функция не сможет справиться с этим. Мне нужно создать структуру каталогов – Dubby

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