javascript - 创建 javascript 递归过滤器函数

标签 javascript recursion

有什么方法可以使这个函数递归,这样我就不需要为过滤条件的每个长度创建一个开关?

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

关于javascript - 创建 javascript 递归过滤器函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27871292/

相关文章:

javascript - 使用 CSS/JS 在图像周围环绕文本

javascript - 快速回复 Facebook Messenger 问题

java - 递归函数没有按预期工作

haskell - 返回一个列表,其中包含一对元素,但前提是各个元素的总和是奇数

Python list of lists 递归增加了额外的嵌套

javascript - Bootstrap 使用 Modal 使用 bundleconfig 时在哪里放置 jquery 和 bootstrap

javascript - 如何将 javascript 变量传递给 JSP 方法?

javascript - 如何从指令中的 templateUrl 运行 $scope 函数?

php - 使用PHP通过FTP递归扫描目录和子目录

c# - C# 中的多线程目录循环