javascript - 多维javascript数组中的直系后代

标签 javascript arrays algorithm multidimensional-array

我有一个高度嵌套的多维数组,类似于下面的数组。为了简单起见,我用json格式表示:

[
    {
        "Object": "Car",
        "Child": [
            {
                "Object": "Toyota",
                "Child": [
                    {
                        "Object": "Prius"
                    },
                    {
                        "Object": "Yaris"
                    }
                ]
            },
            {
                "Object": "Honda",
                "Child": [
                    {
                        "Object": "Accord"
                    },
                    {
                        "Object": "Civic",
                        "Child": [
                            {
                                "Object": "Sedan"
                            },
                            {
                                "Object": "Coupe"
                            }
                        ]
                    }
                ]
            }
        ]
    }
]

如何确定一个对象是否是另一个对象的直系后代?

例如,“Sedan”是“Civic”、“Honda”和“Car”的直系后代;但不是“Coupe”、“Accord”、“Toyota”、“Prius”或“Yaris”的直系后代。

我想做这样的事情:

function Lineal_Descendant(A,B){
    /*do something*/
}

Lineal_Descendant("Sedan","Civic") /*return true*/
Lineal_Descendant("Sedan","Toyota") /*return false*/
Lineal_Descendant("Prius","Honda") /*return false*/
Lineal_Descendant("Yaris","Car") /*return true*/

最佳答案

好的,我试试这个:http://jsfiddle.net/nrabinowitz/UJrhK/

function Lineal_Descendant(child, parent) {
    // search in an array of objects
    function walk(array, search) {
        for (var x=0, found; x<array.length; x++) {
            found = visit(array[x], search);
            if (found) return found;
        }
        return false;
    }
    // search an object and its children
    function visit(obj, search) {
        // found search
        return obj.Object === search ? obj :
            // not found, but has children
            obj.Child ? walk(obj.Child, search) :
            // no children
            false; 
    }
    // find parent
    parent = walk(data, parent);
    // find child, converting to boolean
    if (parent) return !!walk(parent.Child || [], child);
}

可能有更优雅的方法来执行此操作,但这会起作用。请注意,您的数据结构中没有任何内容可以强制使用唯一名称,因此如果您在同一级别有两个项目且 Object 具有相同的值,则搜索可能会返回意外结果。

关于javascript - 多维javascript数组中的直系后代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8959244/

相关文章:

javascript - 如何激活一个选项并禁用其他选项

c++ - 使用二维数组作为参数

c - 如何获得加权平均值,其中最新值的权重是所有先前值的两倍?

javascript - 如何在循环执行时逐渐将内容附加到 div?

Javascript 和 3 参数过滤器

c++ - 指向数组的指针数组?

algorithm - 如何修复不可能的 Osmos 关卡?

algorithm - 查找图中的所有关键节点集

javascript - 根据背景图像删除元素

javascript - 获取 JavaScript 数组中的方法列表