多参数Javascript过滤
我需要使用从字段中获取的多个参数筛选我的内容。字段也可能是空的,因此我需要获取所有非空的值。并通过这些过滤 实现这一目标的最佳方法是什么,而不需要大量的if和else if条件:多参数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 (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不客气!我很高兴能帮上忙:)