【问题标题】:Convert delimited string into hierarchical JSON with JQuery使用 JQuery 将分隔字符串转换为分层 JSON
【发布时间】:2011-09-08 03:10:48
【问题描述】:

我有一个字符串数组,通过用破折号分隔来描述父/子关系。因此,如果 Bob 的老板是 Jim,Jim 的老板是 Fred,则 Bob 在数组中的条目将是“Fred-Jim-Bob”,而 Jim 的条目将是“Fred-Jim”。 我没有能力改变数据的输入方式,所以我一直在寻求帮助,将这些值转换为 JSON 的最佳方式,类似于:

{
    "name": "Fred",
    "children": {
        "name": "Jim",
        "children": {
            "name": "Bob"
        }
    }
}

任何帮助将不胜感激。 谢谢。

【问题讨论】:

  • 你能举一个输入字符串的例子吗?另外,它是无限级的,还是仅限于 3 个?
  • 嗯,这将是一个字符串数组,如上所示。所以对于我上面提到的 json 数组可能是: var emp = new Array("Fred-Jim","Fred","Fred-Jim-Bob");是的,它可能大于或小于 3。

标签: jquery json hierarchy organization


【解决方案1】:
var input = ["Fred-Jim-Bob", "Fred-Jim", "Fred-Thomas-Rob", "Fred"];
var output = [];
for (var i = 0; i < input.length; i++) {
    var chain = input[i].split("-");
    var currentNode = output;
    for (var j = 0; j < chain.length; j++) {
        var wantedNode = chain[j];
        var lastNode = currentNode;
        for (var k = 0; k < currentNode.length; k++) {
            if (currentNode[k].name == wantedNode) {
                currentNode = currentNode[k].children;
                break;
            }
        }
        // If we couldn't find an item in this list of children
        // that has the right name, create one:
        if (lastNode == currentNode) {
            var newNode = currentNode[k] = {name: wantedNode, children: []};
            currentNode = newNode.children;
        }
    }
}

输出 JSON 化为:

[{
    "name": "Fred",
    "children": [{
        "name": "Jim",
        "children": [{
            "name": "Bob",
            "children": []
        }]
    }, {
        "name": "Thomas",
        "children": [{
            "name": "Rob",
            "children": []
        }]
    }]
}]

【讨论】:

  • 示例输入恰好有最多 3 级的字符串,但欢迎您添加更多。尝试加载示例并使其中一个字符串显示为"Fred-Jim-Bob-Mark"。你会发现它也可以正常工作。它可能无法处理数学无穷大,但是当涉及浏览器内存时,任何在合理范围内的东西都应该可以工作。
  • 是的,我正在用它来解析公司的组织结构图的数据,所以我不需要INFINITE级别,但准备了3个以上。
  • 效果很好,有什么办法可以添加 cmets 这段代码吗?在调试你设置 currentNode = currentNode[k] = currentNode[k].children 或 currentNode = newNode.children 时我迷路了,我认为这是该算法中最重要的步骤之一。
猜你喜欢
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 2019-08-23
  • 2019-11-18
  • 1970-01-01
  • 2010-10-19
  • 2011-12-15
  • 1970-01-01
相关资源
最近更新 更多