【问题标题】:How to form a nested JSON object from an array?如何从数组中形成嵌套的 JSON 对象?
【发布时间】:2015-08-02 05:34:15
【问题描述】:

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

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: 'A', children: [{name: 'B', children: []}]}]

【问题讨论】:

  • 你不能在一个对象中有两个相同的键,所以你永远不会在B对象中得到C: DC: XC需要转换为数组[D,X]B[{C:D},{C:X}] 的数组
  • “有没有递归的方法来做到这一点?” 是的,遍历路径,在每次迭代中深入对象一层,直到完成整个小路。但是,首先您必须根据之前的评论提出一个实际有效的架构。
  • 修正了我的差异问题。
  • 您更新的架构,那么您将如何表示 /A/B/C/D/E?还是 /A/Z?
  • 在想一个更规范的结构,比如[{name: 'A', children: [{name: 'B', children: []}]}]

标签: javascript arrays json algorithm recursion


【解决方案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"
        }
    }
}

【讨论】:

  • 但是如果我有多个值,比如孩子或父母,这个函数将无法处理。我需要创建一个目录结构
猜你喜欢
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 2019-08-15
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多