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

时间:2014-12-02 12:57:40

标签: javascript jquery json d3.js

我正在使用带有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;
}

有人知道怎么会这样做吗?

1 个答案:

答案 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;
}