Javascript 递归处理不同的子对象名称
我正在使用D3.js的嵌套JSON提要 当子对象名为Javascript 递归处理不同的子对象名称,javascript,jquery,json,d3.js,Javascript,Jquery,Json,D3.js,我正在使用D3.js的嵌套JSON提要 当子对象名为children时,我的代码可以正常工作,但我也希望能够显示一些其他对象的节点,而不仅仅是名为children的对象 例如,如果在子对象中,我有另一个名为选项的对象。我还想显示该对象的节点 { "item": [{ "children": [{ "name": "banana", "definition": "this is a fruit", "g
children
时,我的代码可以正常工作,但我也希望能够显示一些其他对象的节点,而不仅仅是名为children
的对象
例如,如果在子对象
中,我有另一个名为选项
的对象。我还想显示该对象的节点
{
"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"
}
]
}]
}]
}
这是我的展平函数中的一个递归函数:
// 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;
}
有人知道该怎么做吗?这个问题实际上与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;
}
你期望的结果是什么?这取决于你想要什么。但是,如果使用
for
循环遍历对象,这将非常简单。例如,For(child in parent){console.log(parent[child])}
将打印出parent
对象的每个child
节点。然后你可以应用递归,我想把子对象中的每一项都作为节点输出。所以,如果您有一个“children”对象和一个“countries”对象,那么我想将这两个对象都显示为节点。您是只查找leaf还是所有节点