如何从数组中形成嵌套的JSON对象?

时间:2015-05-20 19:25:32

标签: javascript arrays json algorithm recursion

我有一个路径(作为字符串),如

  

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"}。 我该如何解决?是否有递归方式来做到这一点?

编辑:我之前的架构会导致错误。正如KevinB建议的那样,我正在将模式更新为[{name:&#39; A&#39;,children:[{name:&#39; B&#39;,children:[]}]}]

1 个答案:

答案 0 :(得分: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"
        }
    }
}