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;
}
哦,伙计,这太漂亮了,我怎么没想到递归呢,谢谢