我需要检查深层对象是否包含特定值并返回true / false。此对象的嵌套对象或数组的数量不受限制。
// sample object
{
"id": 2,
"name": "Mann Anderson",
"documents": [
{
"score": 36,
"documentTitle": "Document Title: 8397640",
"source": "RAND Data"
}
],
"emailAddresses": [
"[email protected]"
]
}
并且正在使用此递归函数遍历对象:
function deepQuery(value, q){
if(_.isArray(value) || _.isPlainObject(value)) {
_.each(value, function(v, k) {
return deepQuery(v, q);
});
} else if(value.toString().toLowerCase().indexOf(q) !== -1) {
console.log(true);
return true;
}
}
该功能似乎可以正常工作(the console.log(true)
在预期时出现),但是我只能从undefined
该功能中得到结果。
起初,我认为这是因为我没有将递归调用返回给deepQuery()
,但是如您所见,事实并非如此。
那里:
_.each(value, function(v, k) {
return deepQuery(v, q);
});
您只是从传递给的回调中返回_.each
,而不是从函数中返回。当然,返回只会返回第一个更深层调用的值,而不是第一个肯定搜索的值。
更改为
var v = false;
_.each(value, function(v, k) {
v |= deepQuery(v, q);
});
return v;
或更好:使用良好的旧for
循环来完全避免问题(并避免在找到匹配项时继续迭代):
function deepQuery(value, q){
if (_.isArray(value)) {
for (var i=0; i<value.length; i++) {
if (deepQuery(value[i], q)) return true;
}
} else if(_.isPlainObject(value)) {
for (var k in value) {
if (deepQuery(value[k], q)) return true;
}
} else if(value.toString().toLowerCase().indexOf(q) !== -1) {
return true;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句