Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 递归处理不同的子对象名称_Javascript_Jquery_Json_D3.js - Fatal编程技术网

Javascript 递归处理不同的子对象名称

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

我正在使用D3.js的嵌套JSON提要

当子对象名为
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还是所有节点