Javascript 过滤对象

Javascript 过滤对象,javascript,Javascript,我正在尝试编写一个过滤器函数,它将对象作为参数,查询字符串作为第二个参数。函数应该返回对象中与查询字符串匹配的所有值的列表 比如说 var data = [{ label: 'Cars', children: [{ label: 'Volkswagan', children: [{ label: 'Passat' }] }, { label: 'Toyota' }] }, {

我正在尝试编写一个过滤器函数,它将对象作为参数,查询字符串作为第二个参数。函数应该返回对象中与查询字符串匹配的所有值的列表

比如说

var data = [{
    label: 'Cars',
    children: [{
        label: 'Volkswagan',
        children: [{
            label: 'Passat'
        }]
    }, {
        label: 'Toyota'
    }]
 }, {
     label: 'Fruits',
     children: [{
        label: 'Grapes'
    }, {
        label: 'Oranges'
    }]
 }];

function filter(data, query){}
filter(data,'ra'); //['Grapes', 'Oranges']

我的问题是如何处理每个索引对象的嵌套“children”属性?

尝试根据每个属性的数据类型使用递归调用。例如,如果嵌套属性是一个数组,则需要对该数组的每个元素调用过滤器。类似的逻辑在嵌套元素是对象的情况下,您希望查看每个属性和调用过滤器。我即兴写下了这篇文章,所以我没有测试所有的角落案例,但它适用于您的测试示例:

    var results = [];
filter(data,'ra'); //['Grapes', 'Oranges']
console.log(results);
function filter(data,query){
  for(var prop in data){
    //array
    if(Array.isArray(data[prop])){
      for(var i = 0; i < data[prop].length; i++){
       filter(data[prop][i],query); 
      }   
    } else if (typeof data[prop] === "object"){
     filter(data[prop],query); 
    } else if(typeof data[prop] === "string"){
      if(data[prop].indexOf(query) > -1){
        results.push(data[prop]);
      }
    }
  }
}
var结果=[];
过滤器(数据,'ra')//[‘葡萄’、‘橘子’]
控制台日志(结果);
函数过滤器(数据、查询){
用于(数据中的var prop){
//排列
if(Array.isArray(数据[prop])){
对于(变量i=0;i-1){
结果:推送(数据[prop]);
}
}
}
}
您希望对此使用递归

function filter(data, query){
    var ret = [];

    data.forEach(function(e){
        // See if this element matches
        if(e.label.indexOf(query) > -1){
            ret.push(e.label);
        }

        // If there are children, then call filter() again
        // to see if any children match
        if(e.children){
            ret = ret.concat(filter(e.children, query));
        }
    });

    return ret;
}

哦,伙计,这太漂亮了,我怎么没想到递归呢,谢谢