我正在使用带有D3.js的嵌套JSON Feed
当子对象名为children
时,我的代码工作正常,但我希望能够显示其他几个对象的节点,而不仅仅是children
。
例如,如果在children
对象中,我有另一个名为options
的对象。我也希望显示该对象的节点。
{
"item": [{
"children": [{
"name": "banana",
"definition": "this is a fruit",
"group": "n",
"options": [
{
"color": "red",
"shape": "square"
}
],
"countries": [
{
"color": "america",
"shape": "africa"
}
]
},
{
"name": "apple",
"definition": "this is a fruit",
"group": "n",
"options": [
{
"color": "red",
"shape": "square"
}
]
}]
}]
}
这是我在flatten函数中的递归函数:
// Returns a list of all nodes under the root.
function flatten(root) {
var nodes = [], i = 0;
function recurse(node) {
if (node.children) {
node.size = node.children.reduce(function(p, v) {
return p + recurse(v);
}, 0);
}
if (!node.id) node.id = ++i;
nodes.push(node);
return node.size;
}
root.size = recurse(root);
return nodes;
}
有人知道怎么会这样做吗?
答案 0 :(得分:3)
这个问题与jQuery或D3没有任何关系;它只是简单的JavaScript和JSON。
如果您只是希望您的代码与JSON对象中的任何其他数组一起使用,那么只需更换if语句,检查d["children"]
以查看JSON对象的所有属性,对任何数组进行递归。像这样:
function flatten(root) {
var nodes = [], i = 0;
function recurse(node) {
for (var x in node) {
if (Array.isArray(node[x])) {
node.size = node[x].reduce(function(p, v) {
return p + recurse(v);
}, 0);
}
}
if (!node.id) node.id = ++i;
nodes.push(node);
return node.size;
}
root.size = recurse(root);
return nodes;
}