过滤对象

时间:2015-10-22 16:35:33

标签: javascript

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

例如

num != int(n)

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

2 个答案:

答案 0 :(得分:1)

尝试使用基于每个属性的数据类型的递归调用。例如,如果嵌套属性是一个数组,则需要在该数组的每个元素上调用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]);
      }
    }
  }
}

答案 1 :(得分:1)

您希望使用递归

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