簡體   English   中英

創建一個JavaScript遞歸過濾器函數

[英]creating a javascript recursive filter function

有沒有什么辦法可以使該函數遞歸,這樣我就不必為每個過濾條件長度都創建一個開關了?

var data = [
  {a:'aaa',b:'bbb',c:'ccc',d:'ddd',e:'eee'},
  {a:'aaa',b:'bbb',c:'ccc',d:'eee',e:'fff'},
  {a:'xxx',b:'bbb',c:'ccc',d:'ddd',e:'fff'}
]


function select(data,where){
  return data.filter(function(e){ 
    var k = Object.keys(where); 
    switch(k.length){     
      case 1: return (e[k[0]] == where[k[0]]);
      case 2: return (e[k[0]] == where[k[0]] && e[k[1]] == where[k[1]]);
      case 3: return (e[k[0]] == where[k[0]] && e[k[1]] == where[k[1]] && e[k[2]] == where[k[2]]);
      case 4: return (e[k[0]] == where[k[0]] && e[k[1]] == where[k[1]] && e[k[2]] == where[k[2]] && e[k[3]] == where[k[3]]);
      case 5: return (e[k[0]] == where[k[0]] && e[k[1]] == where[k[1]] && e[k[2]] == where[k[2]] && e[k[3]] == where[k[3]] && e[k[4]] == where[k[4]]);
    }
  })  
}

var where = {a:'aaa',b:'bbb'}

console.log(select(data,where));

它不需要是遞歸的(我不確定您是否理解這意味着什么),您只需要循環where的元素:

 function select(data, where) { return data.filter(function(e) { var k = Object.keys(where); return k.every(function(key) { return e[key] == where[key]; }); }) } var data = [ {a:'aaa',b:'bbb',c:'ccc',d:'ddd',e:'eee'}, {a:'aaa',b:'bbb',c:'ccc',d:'eee',e:'fff'}, {a:'xxx',b:'bbb',c:'ccc',d:'ddd',e:'fff'} ] var where = {a:'aaa',b:'bbb'} console.log(select(data,where)); 

試試這個代碼:

function select(data, where) {
    return data.filter(function (e) {
        for (var key in where) {
            if (where.hasOwnProperty(key)) {
                if (e.hasOwnProperty(key)) {
                    if (e[key] != where[key]) {
                        return false;
                    }
                }
                else {
                    return false
                }
            }
        }

        return true;
    })
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM