2015-01-10 4 views
0

Есть ли способ сделать эту функцию рекурсивной, так что мне не нужно создавать переключатель для каждой длины критериев фильтра?Создание функции рекурсивного фильтра javascript

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

Это так некрасиво, это выглядит почти как VHDL. Извините, nothin 'personal .. – MightyPork

+0

Именно поэтому я задаю вопрос, это работает, но это очень уродливо - я не думаю, что это справедливо, чтобы дать мне негативы на этом, мой код завершен, и мой вопрос ясен! – crankshaft

+0

Ну, это очень грязно, мне трудно понять, какова цель/цель. Не могли бы вы описать желаемое поведение? – MightyPork

ответ

1

Он не должен быть рекурсивными (я не уверен, что вы понимаете, что это значит), вам просто нужно цикла по элементам в 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));

+0

Спасибо, теперь кажется очевидным, также я никогда не использовали все() раньше, это для меня ново. – crankshaft

0

Попробуйте этот код:

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; 
    }) 
} 
Смежные вопросы