通过对象进行过滤

Filter through an object

本文关键字:过滤 对象      更新时间:2023-09-26

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

例如

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']

我的问题是如何解决每个索引对象的嵌套'子'属性?

您需要使用递归

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;
}

尝试根据每个属性的数据类型使用递归调用。例如,在嵌套属性为数组的情况下,您将希望对该数组的每个元素调用filter。类似的逻辑是,嵌套元素是一个对象,您希望查看每个属性并调用过滤器。这是我即兴编写的,所以我没有测试所有的极端情况,但它适用于您的测试示例:

    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]);
      }
    }
  }
}