问题描述
对于这种结构的对象:
const myObj = {
id: 1,
name: '1',
children: [
{
id: 2,
name: '2',
children: [
{
id: 3,
name: '3',
children: []
}
]
},
{
id: 4,
name: '4',
children: [
{
id: 5,
name: '5',
children: [
{
id: 6,
name: '6',
children: [
{
id: 7,
name: '7',
children: []
}
]
}
]
}
]
},
]
}
我如何按值(id)获取对象? 所以我正在寻找一个函数,如果我调用它:
findObj(myObj, 6);
它会返回这个:
{
id: 6,
name: '6',
children: [
{
id: 7,
name: '7',
children: []
}
]
}
另一个例子:
findObj(myObj, 3);
会返回这个:
{
id: 3,
name: '3',
children: []
}
我知道我需要一个递归函数。 这是我到目前为止所拥有的:
findObj(obj, id) {
if (obj.id === id) {
return obj;
}
obj.forEach(x => {
if (x.id === id) {
return x;
} else {
this.findObj(x.children, id);
}
});
}
(这是一个角度类)
1楼
乍一看,我看到了一些问题。
如果您已经在函数中拥有ob.id === id
,则您无需稍后再检查它。
此外,如果findObj
是一个在作用域中定义的函数,与任何其他变量一样,并且不在“类”定义中,则您不需要通过this
调用它,就像第一次调用findObj
一样,没有this
关键字。
此外,首先您将一个对象传递给您的方法,然后您传递一个对象数组( obj.children
),并且您还在forEach
方法中检查 id ,您在其中传递一个函数( x => { ...
thingy),所以当你返回时,你从那个函数而不是主函数返回。
我已经为你修好了。 我建议您了解正在发生的事情并从中学习,因为如果您知道自己在做什么,这将不会发生(调试在这里是您的主人)。
findObj(obj, id) {
if (obj.id === id) {
return obj;
}
for (var i = 0; i < obj.children.length; i++) { // No forEach, so when we return, we actually return from findObj
var r = findObj(obj.children[i], id); // We see if we have any return and let the "check logic" be defined on one location instead of duplicated.
if (r) {
return r;
}
}
}
2楼
两个问题:
-
你的
return x;
语句仅从forEach
回调中返回,而不是从findObj
函数中返回。 不要使用forEach
! 一个简单的for … of
循环就可以了 - 如果您的递归调用找到该对象并返回它,您将忽略它并继续迭代。 检查您是否得到结果并适当处理。
我猜你不是在寻找完整的解决方案,所以我把它留作练习:-)
3楼
您可以检查对象或检查孩子。
function find(object, id) { var result; if (object.id === id) return object; object.children.some(o => result = find(o, id)); return result; } const object = { id: 1, name: '1', children: [{ id: 2, name: '2', children: [{ id: 3, name: '3', children: [] }] }, { id: 4, name: '4', children: [{ id: 5, name: '5', children: [{ id: 6, name: '6', children: [{ id: 7, name: '7', children: [] }] }] }] }] }; console.log(find(object, 5)); console.log(find(object, 6));
.as-console-wrapper { max-height: 100% !important; top: 0; }