1

我正在尝试通过复杂的 JSON 对象(例如this one )进行深度优先搜索,并输出具有以下新结构的新对象:

[
    {
       name: "Blade Runner",
       children : [
           {Obj}, {Obj},{Obj}, ...
       ]
     },
     ...
]

我已经将 d3.js 的recurse()函数作为参考,但似乎无法理解如何在没有预先存在的“子”数组的情况下给定输入 JSON 来编写类似的函数:

function recurse(node, depth, nodes) {
  //assumes children exist in node object
  var childs = children.call(hierarchy, node, depth);
  node.depth = depth;
  nodes.push(node);
  if (childs && (n = childs.length)) {
    var i = -1, n, c = node.children = [], v = 0, j = depth + 1, d;
    while (++i < n) {
      d = recurse(childs[i], j, nodes);
      d.parent = node;
      c.push(d);
      v += d.value;
    }
    if (sort) c.sort(sort);
    if (value) node.value = v;
  } else if (value) {
    node.value = +value.call(hierarchy, node, depth) || 0;
  }
  return node;
}

您将如何编写这样的新函数来对上面的 JSON 响应进行 DFS?

4

1 回答 1

0

正如所评论的,您要创建的新结构的标准尚不清楚。不过,DefiantJS ( http://defiantjs.com ) 可能会帮助您遍历 JSON 结构,例如您举例说明的结构。

DefiantJS 使用“search”方法扩展了全局对象,无论深度如何,您都可以使用它在 JSON 结构中搜索匹配项。该方法返回匹配元素的数组(如果未找到匹配则为空)。

例如:(
在这里工作小提琴:http: //jsfiddle.net/hbi99/x6B3A/

var url = 'https://www.googleapis.com/freebase/v1/search?indent=true&filter=%28all+name%3A%22Blade+Runner%22%29&output=%28disambiguator%29';
Defiant.ajax(url)
    .search('//*[name="Musical Track"]')
    .each(function(item) {
        console.log( item );
    });

此代码下载 JSON 结构并搜索任何名为“Musical Track”的元素并返回两个匹配项。

于 2014-01-14T08:16:37.063 回答