Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过从数组中传入函数查询来筛选记录_Javascript_Arrays_Function_React Native_Object - Fatal编程技术网

Javascript 通过从数组中传入函数查询来筛选记录

Javascript 通过从数组中传入函数查询来筛选记录,javascript,arrays,function,react-native,object,Javascript,Arrays,Function,React Native,Object,我想通过向JavaScript中的函数传递查询参数来获取记录 const data = [{ name: "ab", class: 1, grade: "A", teacher: { teacherName: "tab", age: 34, school: "ab pblc scl" } }, { name: "cd", class: 2, grade: "B", teacher:

我想通过向JavaScript中的函数传递查询参数来获取记录

const data = [{
    name: "ab",
    class: 1,
    grade: "A",
    teacher: {
      teacherName: "tab",
      age: 34,
      school: "ab pblc scl"
    }
  },
  {
    name: "cd",
    class: 2,
    grade: "B",
    teacher: {
      teacherName: "efg",
      age: 35,
      school: "cd pblc scl"
    }
  }
]
我的筛选函数参数(第一个参数是数组,第二个参数是查询,可以是任何内容)

这是一些测试条件

filterMe(数据,{name:“cd”,class:“2”,teacherName:“efg”})
应返回整个对象

{
   name: "cd",
   class: 2,
   grade: "B",
   teacher: {
      teacherName: "efg",
      age: 35,
      school: "cd pblc scl"
   }
}

非常感谢您的帮助。

您可以使用
对象。条目
从提供的对象获取每个密钥,并使用
每个
检查每对密钥是否与筛选条件相同。如果值是对象,则递归调用函数:

const数据=[{
名称:“ab”,
班级:1,
成绩:“A”,
老师:{
教师姓名:“tab”,
年龄:34岁,
学校:“ab pblc scl”
}
},
{
名称:“cd”,
班级:2,
职系:“B”,
老师:{
教师姓名:“efg”,
年龄:35岁,
学校:“cd pblc scl”
}
}
]
常量advFilter=(d,f)=>d.filter(o=>nestedEvery(o,f))
const nestedEvery=(o,v)=>Object.entries(v).every([k,v])=>typeof v=='Object'?nestedEvery(o[k],v):o[k]==v)
const log=console.log
log(advFilter(数据,{name:“cd”,类:2,教师:{teacherName:'efg'}}))//返回cd
log(advFilter(数据,{name:“cd”,类:2,teacherName:'efg'}))//返回[]

log(advFilter(data,{name:'ab',class:1,teacher:{teacherName:'tab'}}))//返回ab
我已经测试了一些测试用例,我认为我的代码正在工作。 试一试:

const数据=[{
名称:“ab”,
班级:1,
成绩:“A”,
老师:{
教师姓名:“tab”,
年龄:34岁,
学校:“ab pblc scl”
}
},
{
名称:“cd”,
班级:2,
职系:“B”,
老师:{
教师姓名:“efg”,
年龄:35岁,
学校:“cd pblc scl”
}
}
]
函数过滤器(数据、查询){
结果=数据。过滤器(x=>{
返回Object.keys(x).some(y=>{
如果(y==“教师”){
返回Object.key(x[y]).some(u=>{
返回Object.keys(查询).some(q=>{
返回查询[q]==x[y][u]
})
})
}否则{
返回Object.keys(查询).some(q=>{
返回查询[q]==x[y]
})
}
})
})
控制台日志(结果);
}

filterMe(data,{name:“cd”,class:“2”,teacherName:“efg”})
请添加实现此目的所需的代码片段我使用的是单个对象,而不是嵌套对象。对于单对象解决方案,请检查@KobeA关于您参数的问题的答案:
{name:“cd”,class:“2”,teacherName:“efg”}
在我看来比
{name:“cd”,class:“2”,teacher:{teacherName:“efg”}
更复杂,那么这是一个选项吗?第一个版本需要递归搜索才能找到嵌套键,第二个版本则不需要,这使它更容易找到。是的@assoron是的,但这正是我想做的。。无论如何,你也可以告诉我{name:“cd”,class:“2”,teacher:{teacherName:“efg”}的代码。我正在寻找可以处理嵌套对象的代码。否则我已经实现了输出。非常感谢,但是我们能否只传递{name:“cd”,class:“2”,teacherName:“efg”}并通过递归搜索使其工作?@jeetdeveloper阅读我在最后的注释。当然这是可能的,但它很耗时,效率低下,而且不可靠。你为什么不能引用路径?没问题。我觉得问题在于你通过过滤对象的那一边,因为如果你通过它过滤,你应该能够知道对象是什么样子。如果您需要更多帮助,只需提问,如果您认为这个答案对您有所帮助,请随意将其标记为正确答案您的代码将返回这两个对象。另外,如果OP使用的属性与teacher不同呢?我认为如果我们查询一个对象,它不会同时返回两个对象。但这并不是为了解决一个广义的解决方案。它只解决了特定的问题。它返回
{name:“ab”,class:“2”,teacherName:“efg”}
您也可以像