2015-10-22 137 views
0

我正在嘗試編寫一個篩選器函數,它將一個對象作爲參數並將查詢字符串作爲其第二個參數。該函數應返回匹配查詢字符串的對象中的所有值的列表。通過對象進行篩選

例如

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

我的問題是如何解決的每個索引對象嵌套的「孩子」屬性?

回答

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

哦,這個男人這麼漂亮,我怎麼沒有想到遞歸謝謝 – RRP

+0

不客氣! :-) –

1

嘗試使用基於每個屬性的數據類型的遞歸調用。例如,在嵌套屬性是數組的情況下,您需要對該數組的每個元素調用過濾器。在嵌套元素是對象的情況下類似的邏輯,你想看看每個屬性和調用過濾器。我寫這篇即興的,所以我沒有測試所有的角落案件,但它的工作原理爲您的測試例如:

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