如何编码“在递归中使用的 DOM 方法的 ID”?
我在'getObjectById 在递归中使用'中遇到问题。执行函数
getObject(data, '11')
--->
undefined
。我不知道为什么会发生这种情况:
undefined
。
在函数
getObject(data, '1'~'9')
---> 中我解决了。但是
'11' ,'12', '13', '14'
--->
undefined
为了解决这个问题,我必须使用
forEach
、
Array.prototype.apply
,但我无法解决它。
使用
filter
--->
TypeError: 无法读取未定义的属性“filter”
使用
length
--->
TypeError: 无法读取未定义的属性“length”
在第一行下,我遇到了需要解决的问题。在第二行下,我编写了解决该问题的代码。我认为我已经解释了解决问题的逻辑。但是在测试用例中,它失败了。
该问题的解决方案是:
let output = getObjectById(TREE_DATA.items, '1'))
console.log(output) --> { "id": "1", "name": "johnny" }
--in first under line,
let TREE_DATA = {
items: [
{
id: "1",
name: "johnny"
},
{
id: "2",
name: "ingi",
children: [
{
id: "3",
name: "johnson"
},
{
id: "4",
name: "katy"
},
{
id: "5",
name: "steve",
children: [
{
id: "6",
name: "lisa"
},
{
id: "7",
name: "penny",
children: [
{
id: "8",
name: "john"
},
{
id: "9",
name: "hoyong"
}
]
},
{
id: "10"
}
]
},
{
id: "11"
},
{
id: "12"
}
]
},
{
id: "13"
},
{
id: "14"
}
]
};
--in second under line,
function getObject(json, id) {
let test = json.items;
let newA = [];
function getA(a, id) {
a.filter(function(e) {
console.log("this is : ", e);
if (e.id && e.id === id) {
return newA.push(e);
} else if (e.id !== id && e.children) {
return getA(e.children, id);
}
});
}
getA(test, id);
return newA[0];
}
由于您的输入数据是递归结构,因此具有递归结构的程序将是最好的匹配。在这种情况下,您有 -
- a 列表
-
每个
节点
(
object
)可能包含一个
儿童
属性 ,这也是 节点的
这种递归关系为我们提供了一个独特的机会,可以学习一种特殊类型的递归,其中一个函数 a ,调用函数 b function a ,称为 b ,依此类推...这称为 相互递归 。
仅采用输入节点的
一个
的函数,恰当地命名为
find1
。它接受一个单个节点,破坏了
儿童
和
o
,以及搜索的ID,
ID
-
497063597
接下来很明显我们需要实现
findall
。它接受节点的A
列表
,破坏了
first
和
更多
,以及搜索的ID,
ID> ID
-
455081724
就是这样!这些功能几乎写作,不需要外部变量或步骤。它的行为与我们期望的完全一样 -
490503177
通过运行下面的摘要 -
996454949
,验证自己浏览器中的结果
这是您要找的吗?
let TREE_DATA = {
items: [
{
id: "1",
name: "johnny"
},
{
id: "2",
name: "ingi",
children: [
{
id: "3",
name: "johnson"
},
{
id: "4",
name: "katy"
},
{
id: "5",
name: "steve",
children: [
{
id: "6",
name: "lisa"
},
{
id: "7",
name: "penny",
children: [
{
id: "8",
name: "john"
},
{
id: "9",
name: "hoyong"
}
]
},
{
id: "10"
}
]
},
{
id: "11"
},
{
id: "12"
}
]
},
{
id: "13"
},
{
id: "14"
}
]
};
function getObject(json, id) {
let test = json.items;
let newA = [];
function getA(a, id) {
a &&
a.forEach(function(e) {
if (e.id === id) {
newA.push(e);
} else if (e.children) {
getA(e.children, id);
}
});
}
getA(test, id);
return newA[0];
}
function getObjectById(items, key) {
let ret = {};
for (let item of items) {
if (item.id === key) {
return item;
}
if (item.children) {
let innerRet = getObjectById(item.children, key);
if (Object.keys(innerRet).length) return innerRet;
}
}
return ret;
}
console.log("2", getObjectById(TREE_DATA.items, "2"));
console.log("3", getObjectById(TREE_DATA.items, "3"));
console.log("11", getObjectById(TREE_DATA.items, "11"));
console.log("12", getObjectById(TREE_DATA.items, "12"));
console.log("13", getObjectById(TREE_DATA.items, "13"));
console.log("2", getObject(TREE_DATA, "2"));
console.log("3", getObject(TREE_DATA, "3"));
console.log("11", getObject(TREE_DATA, "11"));
console.log("12", getObject(TREE_DATA, "12"));
console.log("13", getObject(TREE_DATA, "13"));
编辑:调试并添加了您的功能。