我需要检查深层对象是否包含特定值并返回true / false。此对象不限于它可以具有的嵌套对象或数组的数量。
// sample object
{
"id": 2,
"name": "Mann Anderson",
"documents": [
{
"score": 36,
"documentTitle": "Document Title: 8397640",
"source": "RAND Data"
}
],
"emailAddresses": [
"mann.anderson@kidgrease.ca"
]
}
我正在使用这个递归函数迭代对象:
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()
,但正如您所看到的,情况并非如此。
答案 0 :(得分:2)
有:
_.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;
}
}