我正在尝试在对象中进行递归搜索,并且我试图根据某些条件找到所有匹配。我正在使用以下功能:
function checkForTitleMatch(query, node) {
var results = [];
if (node.attr.title.indexOf(query) != -1) {
results.push = node;
}
for (var i = 0; i < node.children.length; i++) {
checkForTitleMatch(query, node.children[i]);
}
return results;
}
我不认为匹配中存在问题等等 - 我认为问题在于我在递归中返回结果的方式。
我的情况下的结果总是一个空数组,因为第一个/根元素永远不会匹配(在我的情况下)并且没有正确返回子迭代的结果,imho。
有人可以纠正我或指出必须更改的内容才能得到正确的结果吗?
答案 0 :(得分:3)
你有两个问题:
(1)results.push = node;
它应该是results.push(node)
。
(2)checkForTitleMatch
的每次调用都会创建自己的results
数组,并且数组永远不会聚合。
解决此问题的一种可能方法:
function checkForTitleMatch(query, node) {
var results = [];
(function check(node) {
if (node.attr.title.indexOf(query) != -1) {
results.push(node);
}
for (var i = 0; i < node.children.length; i++) {
check(node.children[i]);
}
})(node);
return results;
}
即使清晰/更快,也会使用attribute selector,例如
node.querySelectorAll('*[title*=' + query + ']');
虽然这不会查询顶级节点node
,并假设query
没有&#34;特殊字符&#34;。
答案 1 :(得分:0)
值得注意的是,您可以通过使用Array.concat
合并结果来解决此问题:
function checkForTitleMatch(query, node){
var results = [];
if (node.attr.title.indexOf(query) != -1){
results.push(node);
}
for (var i=0; i<node.children.length; i++){
results = Array.prototype.concat.apply(results,
checkForTitleMatch(query, node.children[i])
);
}
return results;
}