在javascript中的对象数组中搜索深度嵌套的值
我基本上是在尝试实现对任何给定值的搜索,这些值应该在对象键值数组中查找(也可以是嵌套对象)。这里有一个例子。下面的函数将使用一个对象和一个查询在数组对象键值中搜索。因此,如果找到匹配项,它应该从该数组中筛选在javascript中的对象数组中搜索深度嵌套的值,javascript,arrays,Javascript,Arrays,我基本上是在尝试实现对任何给定值的搜索,这些值应该在对象键值数组中查找(也可以是嵌套对象)。这里有一个例子。下面的函数将使用一个对象和一个查询在数组对象键值中搜索。因此,如果找到匹配项,它应该从该数组中筛选 function searchObj (obj, query) { for (var key in obj) { var value = obj[key]; if (typeof value === 'object') { searchObj(value,
function searchObj (obj, query) {
for (var key in obj) {
var value = obj[key];
if (typeof value === 'object') {
searchObj(value, query);
}
if (typeof value === 'string' && value.toLowerCase().indexOf(query.toLowerCase()) > -1) {
return obj;
}
}
}
这是虚拟数据
var demoData=[
{id:1,desc:{original:'trans1'},date:'2017-07-16'},
{id:2,desc:{original:'trans2'},date:'2017-07-12'},
{id:3,desc:{original:'trans3'},date:'2017-07-11'},
{id:4,desc:{original:'trans4'},date:'2017-07-15'}
];
这是我正在筛选匹配对象的数组
var searchFilter = demoData.filter(function(obj){
return searchObj(obj, 'trans1');
});
console.log(searchFilter);
例如:如果我调用
searchObj(obj,'2017-07-15')
它将返回该特定对象,但如果我搜索trans1
或仅搜索trans
,它应该查看该对象,然后返回匹配项。我现在有点困了,如果有任何帮助,我将不胜感激。谢谢。案例1正在运行,因为您没有使用递归。但在案例2中,即使在找到结果后,您仍在继续搜索
找到后返回对象
if (typeof value === 'object') {
return searchObj(value, query);
}
if (typeof value === 'string' && value.toLowerCase().indexOf(query.toLowerCase()) > -1) {
return obj;
}
函数searchObj(obj,查询){
for(obj中的var键){
var值=obj[键];
如果(值的类型==='object'){
返回searchObj(值,查询);
}
if(typeof value==='string'&&value.toLowerCase().indexOf(query.toLowerCase())>-1){
返回obj;
}
}
}
蠕形变数=[
{id:1,描述:{原件:'trans1'},日期:'2017-07-16'},
{id:2,描述:{原件:'trans2'},日期:'2017-07-12'},
{id:3,描述:{原件:'trans3'},日期:'2017-07-11'},
{id:4,描述:{原件:'trans4'},日期:'2017-07-15'}
];
var searchFilter=demoData.filter(函数(obj){
返回searchObj(obj,‘trans1’);
});
console.log(searchFilter)代码>另一种方法是只使用JSON.stringify并在其中搜索:
searchObj(obj, string) {
const regExpFlags = 'gi',
regExp = new RegExp(string, regExpFlags);
return JSON.stringify(obj).match(regExp);
}
然后测试搜索模式:
var searchFilter = demoData.filter(function(obj){
return searchObj(obj, 'trans1');
});
console.log(searchFilter);
您甚至可以更进一步,通过提供字符串数组实现松散搜索:
searchObj(obj, string) {
const jsonString = JSON.stringify(obj);
regExpFlags = 'gi',
regExpArray = string.split(' ');
testArray = [];
regExpArray.forEach(term => {
let regExp = new RegExp(term, regExpFlags);
if (jsonString.match(regExp) {
testArray.push(term);
}
});
return regExpArray.length === testArray.length;
}
我修改了数据:
var demoData=[
{id:1,desc:{original:'trans1'},date:'2017-07-16'},
{id:1,desc:{original:'trans2'},date:'2017-07-12'},
{id:1,desc:{original:'trans3'},date:'2017-07-13'},
{id:2,desc:{original:'trans4'},date:'2017-07-12'},
{id:3,desc:{original:'trans5'},date:'2017-07-12'},
{id:4,desc:{original:'trans6'},date:'2017-07-15'},
{id:1,desc:{original:'trans7'},date:'2017-07-12'}
];
搜索词:
var searchFilter = demoData.filter(function(obj){
return searchObj(obj, 'trans 2017-07-12');
});
console.log(searchFilter);
这里需要注意的一件重要事情是JSON.stringify的性能,因此在深度嵌套对象数量有限的情况下,这对我来说效果很好(我知道这已经被问过并回答过了,你彻底回答过了吗?你的递归步骤缺少一些非常重要的东西。^^^具体地说,return
。你需要返回递归调用的结果。而不是使用for..在中,我尝试使用Object.keys(obj)除了空数组,哪一个不会返回任何东西?@MuraliPrasanth不。你不能从forEach返回。