我有一个高度嵌套的多维数组,类似于下面的数组。为了简单起见,我用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/