Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.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_Filter_Foreach - Fatal编程技术网

Javascript 基于查询对象筛选对象数组

Javascript 基于查询对象筛选对象数组,javascript,filter,foreach,Javascript,Filter,Foreach,似乎无法归还我想要的东西。最后,我想返回一个对象数组,或者一个可能匹配两个不同部分键/值过滤器的单个对象。换言之: const curQuery={name:'Nex',tacTechnology:'Dat'} 我计划在一个表的标题中使用多个过滤器 const data = [{ "id": "1", "name": "Unified Communications Portal", "tacTechnology": "Co

似乎无法归还我想要的东西。最后,我想返回一个对象数组,或者一个可能匹配两个不同部分键/值过滤器的单个对象。换言之: const curQuery={name:'Nex',tacTechnology:'Dat'}

我计划在一个表的标题中使用多个过滤器

 const data = [{
            "id": "1",
            "name": "Unified Communications Portal",
            "tacTechnology": "Collaboration"
        }, {
            "id": "2",
            "name": "ACE Training Portal",
            "tacTechnology": "Networking Services"
        }, {
            "id": "3",
            "name": "Nexus 5K/2K Training Portal",
            "tacTechnology": "Data Center"
        }, {
            "id": "4",
            "name": "XR Training Portal",
            "tacTechnology": "Routing"
        }]

const curQuery = {name:'Nex'}

function setFilteredItems(curQuery) {
  const curQueryKeys = Object.keys(curQuery)
  const filteredItems = data.filter(
    (item) => {
      curQueryKeys.forEach((objKey) => {
        if (item[objKey] === undefined || curQuery[objKey] === null){
          console.log('its not', item[objKey], curQuery[objKey])
          return false;
        }
       else if(item[objKey].toLowerCase().includes(curQuery[objKey].toLowerCase())) {
         console.log('it includes', item[objKey], curQuery[objKey])
         return item;
         }
      })
    }
  )
  console.log('filteredItems', filteredItems )
}

setFilteredItems(curQuery);
期望filteredItems是{ “id”:“3”, “名称”:“Nexus 5K/2K培训门户”, “技术”:“数据中心” },但什么也得不到


我在这里创建了一个快速代码笔:

问题是您正在返回
forEach
调用,这只是(类似于
continue
)。如果对循环使用常规的
,则代码的工作方式与预期相同,因为
返回
用于传递给
过滤器的函数

const数据=[{
“id”:“1”,
“名称”:“统一通信门户”,
“战术技术”:“协作”
}, {
“id”:“2”,
“名称”:“ACE培训门户”,
“tacTechnology”:“网络服务”
}, {
“id”:“3”,
“名称”:“Nexus 5K/2K培训门户”,
“技术”:“数据中心”
}, {
“id”:“4”,
“名称”:“XR培训门户”,
“战术技术”:“路线”
}]
常量curQuery={
名称:“Nex”
}
函数setFilteredItems(curQuery){
const curQueryKeys=Object.keys(curQuery)
常量filteredItems=data.filter((项)=>{
对于(curQueryKeys的const objKey){
if(项[objKey]==未定义| | curQuery[objKey]==空){
log('its not',item[objKey],curQuery[objKey])
返回false;
}else if(项[objKey].toLowerCase().includes(curQuery[objKey].toLowerCase())){
log('it includes',item[objKey],curQuery[objKey])
返回true;
}
}
});
log('filteredItems',filteredItems)
}

setFilteredItems(curQuery)您可以从查询对象中获取键/值,并通过检查对象的值和所需的值来迭代条目

如果不希望查询的所有属性,可以替换为

函数getItems(查询){
var entries=Object.entries(query.map)([k,v])=>[k,v.toLowerCase()];
返回data.filter(o=>entries.every([k,v])=>o[k].toLowerCase().includes(v));
}
常数
数据=[{id:“1”,名称:“统一通信门户”,tacTechnology:“协作”},{id:“2”,名称:“ACE培训门户”,tacTechnology:“网络服务”},{id:“3”,名称:“Nexus 5K/2K培训门户”,tacTechnology:“数据中心”},{id:“4”,名称:“XR培训门户”,tacTechnology:“路由”};
log(getItems({name:'Nex'}))
。作为控制台包装{最大高度:100%!重要;顶部:0;}