在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返回。