Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.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_Data Structures_Ecmascript 6_Javascript Objects - Fatal编程技术网

Javascript 如何根据多个条件筛选数据?

Javascript 如何根据多个条件筛选数据?,javascript,arrays,data-structures,ecmascript-6,javascript-objects,Javascript,Arrays,Data Structures,Ecmascript 6,Javascript Objects,好的,我有一个对象数组,它是我要过滤的数据: const posts = [ { hairday: '2', products: ['product1', 'product2', 'product3', 'product4'], rating: '2', drying: 'diffuser' }, { hairday: '2', products: ['product6', 'product7', 'product8', 'product9'], rating: '4', dry

好的,我有一个对象数组,它是我要过滤的数据:

const posts = [
{
 hairday: '2',
 products: ['product1', 'product2', 'product3', 'product4'],
 rating: '2',
 drying: 'diffuser'
},
{
 hairday: '2',
 products: ['product6', 'product7', 'product8', 'product9'],
 rating: '4',
 drying: 'air dry'
},
{
 hairday: '3',
 products: ['product10', 'product11', 'product13', 'product14'],
 rating: '3',
 drying: 'air dry'
},
{
 hairday: '4',
 products: ['product15', 'product26', 'product37', 'product14'],
 rating: '5',
 drying: 'towel dry'
},
]
我想按多种条件过滤上述数据。以下是条件对象的示例:

{
 products: ['product1', 'product13'],
 hairday: ['2', '3'],
 drying: ['air dry', 'diffuser'],
 rating: []
}
因此,我想获得所有与每个数组中至少一个项匹配的
post
对象

因此,过滤项目应具有product1或product13和hairday 2或hairday 3以及干燥空气干燥或干燥扩散器和任何等级

最好的办法是什么?我的筛选器对象是否以最佳方式构造?
提前感谢提供了一个更强大的解决方案,它不需要手动列出键,您可以使用
Object.keys()
迭代criteria对象,然后将
post
数组中的各个对象与之进行比较:

const filtered = posts.filter(post => {
  const conditionKeys = Object.keys(conditions);
  const fulfillments = conditionKeys.map(k => {
    const condition = conditions[k];
    
    // If we encounter an empty array, then criteria is always met
    if (condition.length === 0) {
      return true;
    }
    
    // Enforces that as long as ONE subcondition is met (`OR`)
    return condition.filter(v => post[k].includes(v)).length > 0;
  });
  
  // Enforce that EVERY condition must be met (`AND`)
  // A condition is considered met as long as it is true
  return fulfillments.every(x => x);
});
当遍历单个条件(hairday、products等)时,我们只想检查您的对象是否包含一个或多个列出的值(即两个数组中的任意一个相交)。如果存在交点,则长度将>0,否则将为0

见下面的概念证明:

const posts=[{
发日:'2',
产品:['product1','product2','product3','product4'],
评级:"2",,
干燥:“扩散器”
},
{
发日:'2',
产品:['product6'、'product7'、'product8'、'product9'],
评级:"4",,
干燥:“风干”
},
{
发日:'3',
产品:['product10'、'product11'、'product13'、'product14'],
评级:"3",,
干燥:“风干”
},
{
发日:'4',
产品:['product15'、'product26'、'product37'、'product14'],
评级:"5",,
烘干:“毛巾烘干”
},
];
常数条件={
产品:['product1'、'product13'],
发生日:['2','3'],
干燥:[“风干”、“扩散器”],
评级:[]
};
const filtered=posts.filter(post=>{
const fulfillments=Object.keys(conditions).map(k=>{
常数条件=条件[k];
//如果遇到空数组,则始终满足条件
if(condition.length==0){
返回true;
}
返回条件.filter(v=>post[k]。包括(v)).length>0;
});
返回完成情况。每(x=>x);
});

console.log(过滤)我可以这样编写一个相当通用的版本:

constfindmatches=(过滤器,xs)=>
xs.filter(x=>Object.entries(filters).every([name,vals])=>
vals.length==0||
(Array.isArray(x[名称])
?x[名称]。部分(val=>val.包括(val))
:VAL.包括(x[名称])
))
const posts=[{hairday:'2',产品:['product1','product2','product3','product4'],评级:'2',干燥:'diffuser'},{hairday:'2',产品:['product6','product7','product8','product9'],评级:'4',干燥:'air dry'},{hairday:'3',产品:['product10','product11','product13','product14'],评级:'3',干燥:'air dry'},{头发日:'4',产品:['product15','product26','product37','product14',评级:'5',干燥:'毛巾干燥'}]
常量过滤器={产品:['product1','product13'],发日:['2','3'],干燥:['air dry','diffuser'],额定值:[]
console.log(findMatches(过滤器、帖子))

.as console wrapper{min height:100%!important;top:0}
你能告诉我们到目前为止你都做了些什么吗?那
映射/过滤(x=>x)/equal length
位可能会被
每一个
位所取代。我的意思比这多一点。这可能只是
posts.filter(post=>Object.keys(conditions)。每一个(k=>{/*这里的代码相同*/})
。除了更干净之外,它还可以尽快短路。还可以将
.filter(…).length>0
替换为
some(…)
,我们可以得到
const filtered=posts.filter(post=>Object.keys(conditions)。every(k=>conditions[k]。length==0 | conditions[k]。一些(v=>post[k].includes(v))
,它比您的原始版本或我的类似解决方案简单得多。