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

多参数Javascript过滤

多参数Javascript过滤,javascript,filtering,Javascript,Filtering,我需要使用从字段中获取的多个参数筛选我的内容。字段也可能是空的,因此我需要获取所有非空的值。并通过这些过滤 实现这一目标的最佳方法是什么,而不需要大量的if和else if条件: if (a !== '' && b !== '' && c !== '' && d !== '' && e !== ''){ // none is empty, filter by a & b & c & d & e

我需要使用从字段中获取的多个参数筛选我的内容。字段也可能是空的,因此我需要获取所有非空的值。并通过这些过滤

实现这一目标的最佳方法是什么,而不需要大量的if和else if条件:

if (a !== '' && b !== '' && c !== '' && d !== '' && e !== ''){
    // none is empty, filter by a & b & c & d & e
}

else if ( b !== '' && c !== '' && d !== '' && e !== ''){ 
    // a is empty, filter by b & c & d & e
}

else if ( a !== '' && c !== '' && d !== '' && e !== ''){ 
    // b is empty, filter by a & c & d & e
}

else if ( b !== '' && a !== '' && d !== '' && e !== ''){ 
}

else if ( b !== '' && c !== '' && a !== '' && e !== ''){ 
}

else if ( b !== '' && c !== '' && d !== '' && a !== ''){ 
}

else if ( c !== '' && d !== '' && e !== ''){
}

else if ( b !== '' && d !== '' && e !== ''){
}

else if ( b !== '' && c !== '' && e !== ''){ 
}

else if ( b !== '' && c !== '' && d !== ''){ 
}

else if ( a !== '' && d !== '' && e !== ''){ 
}

and so on...
或者,我如何获得这5个字母的所有唯一可能组合

编辑::

实际的代码应该是这样的

  //a/b/c take value of dropdown items, that match with data on an object

    if (a != '' && b != '' && c != '') {

            for (const i in ParticipationList.TaskMetadata) {
                if (ParticipationList.TaskMetadata[i].attendance == a && ParticipationList.TaskMetadata[i].monitoring_status == b  && ParticipationList.TaskMetadata[i].monitoring_status == c) {
                            filteredaudience[i] = { ['id']: i }
                        }
            console.log(filteredaudience)
            // get all the items that match with the object properties
        }
    }

因此,如果
a
b
c
为空,我仍然无法进行相同的调用,因为它与对象上的任何内容都不匹配。

根据实际过滤过程的工作方式,可以增量过滤结果,而不是同时进行过滤

例如,如果您的数据是一个数组,则可以编写:

let data = ...;
if (a != '') {
    data = data.filter(elem => checkForA(a, elem));
}
if (b != '') {
    data = data.filter(elem => checkForB(b, elem));
}
...

也许您还可以增量增加筛选器对象本身,然后应用生成的筛选器。

请输入更多详细信息。。。 现在,我的理解是你想得到所有的 不为空的值

为此:

let allElements = [a, b, c, d, e]
let notEmpty = []

allElements.forEach(element => {
    if (element !== '')
        notEmpty.push(element)
});
console.log(notEmpty)

逻辑:

由于javascript已经存在,我们将只使用以下格式中的一组条件:

field === "" || (condition to filter using field)
由于上述“短路”,只有当字段不为空时(即,如果左侧为
,因为
字段!==”
),才能到达右侧部分。但是,如果字段为空,则
字段===“”
将为
,并且不会到达右侧部分,整个条件将产生
,从而跳过对该字段的筛选

逻辑的
&&
运算符应将多个条件连接在一起,并且这些条件中的每一个都应包装在括号
()
中,因为运算符
&&
的优先级高于
|
运算符

如果要筛选的数据是数组:

对于数组,只需将条件用作从
filter
的回调返回的值,如下所示:

let filteredData = data.filter(item =>
  (a === "" || (condition for field 'a' against 'item'))
  &&
  (b === "" || (condition for field 'b' against 'item'))
  &&
  (c === "" || (condition for field 'c' against 'item'))
  &&
  (d === "" || (condition for field 'd' against 'item'))
  &&
  (e === "" || (condition for field 'e' against 'item'))
);
let filteredaudience = {};

for (const i in ParticipationList.TaskMetadata) {
  if ((a === "" || ParticipationList.TaskMetadata[i].attendance === a)
   && (b === "" || ParticipationList.TaskMetadata[i].monitoring_status === b)
   && (c === "" || ParticipationList.TaskMetadata[i].monitoring_status === c)
   && (d === "" || ParticipationList.TaskMetadata[i].?????????? === d)
   && (e === "" || ParticipationList.TaskMetadata[i].?????????? === e)) {
    filteredaudience[i] = { id: i };
  }
}
如果要筛选的数据是对象:

如果数据是一个对象,您不能像上面那样使用
过滤器
,您仍然可以使用相同的逻辑,您只需使用
中的条件,如果
像这样:

let filteredData = data.filter(item =>
  (a === "" || (condition for field 'a' against 'item'))
  &&
  (b === "" || (condition for field 'b' against 'item'))
  &&
  (c === "" || (condition for field 'c' against 'item'))
  &&
  (d === "" || (condition for field 'd' against 'item'))
  &&
  (e === "" || (condition for field 'e' against 'item'))
);
let filteredaudience = {};

for (const i in ParticipationList.TaskMetadata) {
  if ((a === "" || ParticipationList.TaskMetadata[i].attendance === a)
   && (b === "" || ParticipationList.TaskMetadata[i].monitoring_status === b)
   && (c === "" || ParticipationList.TaskMetadata[i].monitoring_status === c)
   && (d === "" || ParticipationList.TaskMetadata[i].?????????? === d)
   && (e === "" || ParticipationList.TaskMetadata[i].?????????? === e)) {
    filteredaudience[i] = { id: i };
  }
}

新开发人员的一个常见错误是使用大量的&&和| |符号或长串if/else if创建长、复杂和重复的if语句

与其这样,不如编写一个简单的搜索谓词。这是一个函数,它接受一些参数,并将它们减少为true或false

在所述函数中,每次运行一个过滤器。一旦失败,返回false

var数据=[
{颜色:“红色”,重量:2,名称:“示例1”},
{颜色:“橙色”,重量:15,名称:“示例2”},
{颜色:“黄色”,重量:10,名称:“试验1”},
{颜色:“绿色”,重量:24,名称:“试验2”}
];
log(搜索(数据,“红色”、[]、“”);
日志(搜索(数据“,[5,20],”);
日志(搜索(数据,“,[],“测试”);
功能搜索(数据、颜色、重量、名称){
返回数据.filter(row=>testRow(颜色、权重、名称、行));
}
//更容易阅读。
函数测试行(颜色过滤器、权重过滤器、名称搜索过滤器、行){
//每次运行一个过滤器。如果任何过滤器出现故障,“短路”输出。
if(colorFilter!=''&&row.color==colorFilter){
返回false;
}
//有时,双if语句更容易阅读。
如果(weightFilter.length>0){
if(row.weightweightFilter[1]){
返回false;
}
}
//有时,实际规则有点复杂。
如果(名称搜索过滤器!=“”){
if(row.name.indexOf(nameSearchFilter)<0){
返回false;
}
}
//我们躲过了所有的过滤器。
返回true;

}
您是如何使用非空字段过滤数据的?请提供更多详细信息。您是否有一些数据可供说明?我建议您可能不想使用此类
逻辑(如果有)。你最终想要实现什么?例如,您可以创建
r=[a,b,c,d,e]
,然后创建
console.log(“这些是非空值:”,r.filter(v=>!!v))
尝试
[a,b,c,d,e]。filter(field=>field!==”)
这不理想,如果阵列很大,则速度会很慢,因为它可能会多次循环阵列,而不是仅循环一次。ibrahim mahrir不太可能,每个过滤器的数据都会变小。这几乎和单个搜索功能一样高效。好吧,在作者提供正确理解问题所需的详细信息之前,我已经写下了我的答案。有了这些信息,易卜拉欣的回答很好,我会投赞成票:)@sanbenedeto不客气!我很高兴能帮上忙:)