使用JavaScript过滤多个参数?
我有一个需要过滤的对象数组 如果对象的活动值为true,则无论其他因素如何,都应始终返回该值 如果输入了searchText,则列表的其余部分应通过此搜索文本进行过滤 如果输入了countrySearch,则列表应按此值过滤,如果提供了searchText,还应按searchText过滤使用JavaScript过滤多个参数?,javascript,Javascript,我有一个需要过滤的对象数组 如果对象的活动值为true,则无论其他因素如何,都应始终返回该值 如果输入了searchText,则列表的其余部分应通过此搜索文本进行过滤 如果输入了countrySearch,则列表应按此值过滤,如果提供了searchText,还应按searchText过滤 const searchText = 'Di'; const countrySearch = "USA"; const myArray = [ { name: "Tom",
const searchText = 'Di';
const countrySearch = "USA";
const myArray = [
{
name: "Tom",
country: "UK",
active: true
},
{
name: "Dick",
country: "USA",
active: false
},
{
name: "Dimmon",
country: "FR",
active: false
}
].filter(item => {
if (item.active === true) {
return true;
}
if (searchText) {
if(item.name.includes(searchText)) {
return true;
}
}
});
console.log(myArray);
在本例中,新数组应包含Tom,因为active为true。它应该包含迪克,因为他通过了searchText和countrySearch测试。Dimmon不应该出现在新数组中,因为他只传递了一个searchText和countrySearch搜索条件
我可以用目前的方法来解决这个问题,但是嵌套的if语句会让问题变得一团糟。而且,随着时间的推移,我的搜索条件可能会变得越来越复杂。这是函数式编程的好例子吗 试试看:
.filter(item => {
if (
(item.active === true) ||
(searchText && item.name.includes(searchText))
) {
return true;
}
}
})
尝试:
根据您的搜索方法,您可以将代码简化如下 第一次搜索将条件与OR子句联接。它只是查看
active
属性设置为true
,或name属性包含Dilexem的对象数组-因此所有三个对象都匹配
第二个也执行相同的操作,但这次使用和子句,结果是空数组。因为没有一个对象同时在这两种条件下都起作用
const searchText='Di';
const countrySearch=“美国”;
常量myArray=[
{
姓名:“汤姆”,
国家:“英国”,
主动:正确
},
{
名字:“迪克”,
国家:“美国”,
活动:错误
},
{
名称:“迪蒙”,
国家:“FR”,
活动:错误
}
]
console.log('或')
log(myArray.filter(e=>e.active | | e.name.includes(searchText));
console.log('AND')
log(myArray.filter(e=>e.active&&e.name.includes(searchText))代码>根据您的搜索方法,您可以按如下方式简化代码
第一次搜索将条件与OR子句联接。它只是查看active
属性设置为true
,或name属性包含Dilexem的对象数组-因此所有三个对象都匹配
第二个也执行相同的操作,但这次使用和子句,结果是空数组。因为没有一个对象同时在这两种条件下都起作用
const searchText='Di';
const countrySearch=“美国”;
常量myArray=[
{
姓名:“汤姆”,
国家:“英国”,
主动:正确
},
{
名字:“迪克”,
国家:“美国”,
活动:错误
},
{
名称:“迪蒙”,
国家:“FR”,
活动:错误
}
]
console.log('或')
log(myArray.filter(e=>e.active | | e.name.includes(searchText));
console.log('AND')
log(myArray.filter(e=>e.active&&e.name.includes(searchText))代码>给定您可以使用的预期逻辑活动,或国家搜索和国家搜索等于国家搜索和搜索文本和名称.includes()
搜索文本,或
搜索文本
和
国家搜索
为假
和
名称
.includes(),或
搜索文本
为假
和
国家搜索
和
国家搜索
等于国家
const searchText='Di';
const countrySearch=“美国”;
常量myArray=[{
姓名:“汤姆”,
国家:“英国”,
主动:正确
},
{
名字:“迪克”,
国家:“美国”,
活动:错误
},
{
名称:“迪蒙”,
国家:“FR”,
活动:错误
}
]
.filter({active,name,country})=>
活跃的
||countrySearch&&countrySearch==国家
&&searchText&&name.includes(searchText)
||searchText&!countrySearch&&name.includes(searchText)
||!searchText&&countrySearch&&countrySearch==国家
);
log(myArray)代码>给定您可以使用的预期逻辑活动,或国家搜索和国家搜索等于国家搜索和搜索文本和名称.includes()
搜索文本,或
搜索文本
和
国家搜索
为假
和
名称
.includes(),或
搜索文本
为假
和
国家搜索
和
国家搜索
等于国家
const searchText='Di';
const countrySearch=“美国”;
常量myArray=[{
姓名:“汤姆”,
国家:“英国”,
主动:正确
},
{
名字:“迪克”,
国家:“美国”,
活动:错误
},
{
名称:“迪蒙”,
国家:“FR”,
活动:错误
}
]
.filter({active,name,country})=>
活跃的
||countrySearch&&countrySearch==国家
&&searchText&&name.includes(searchText)
||searchText&!countrySearch&&name.includes(searchText)
||!searchText&&countrySearch&&countrySearch==国家
);
log(myArray)代码>这里有另一种方法,您可以使用
- 可以使用任意数量的过滤器
- 输入数组将只被遍历一次
const comp=(f,g)=>
x=>f(g(x))
常量组合=(…fs)=>
fs.reduce(comp,x=>x)
常量附加=(xs,x)=
const searchText = 'Di';
const countrySearch = "USA";
const myArray = [
{
name: "Tom",
country: "UK",
active: true
},
{
name: "Dick",
country: "USA",
active: false
},
{
name: "Dimmon",
country: "FR",
active: false
}
]
function getFilterResult(b, c) {
return myArray.filter(function(a, d) {
// if countrySearch is undefined then return only active & name
// which pass the searchText, else return where all the conditions match
return void 0 === c ? a.active || a.name.includes(b) :
a.active || a.name.includes(b) && a.country === c;
});
};
console.log(getFilterResult(searchText,countrySearch));