Javascript通过使用多个数组过滤记录



我有结果类型的对象。我想从结果obj中筛选记录。我的表单中有3个过滤器(按姓名、城市、电子邮件搜索(。所有过滤器都是多选的。现在我想通过上面的过滤器数组来过滤我的结果记录。

用户使用以下数组按记录筛选

var searchByname = ['john', 'test1'];
var searchByEmail = ['john@gmail.com', 'test1@gmail.com'];
var searchByCity = ['CA', 'LA'];

应该进行筛选的实际结果对象

var result = [
{
'name': 'john',
'email': 'john@gmail.com',
'city': 'CA',
'phone': 425663313
},
{
'name': 'test1',
'email': 'test1@gmail.com',
'city': 'LA',
'phone': 7418669633
},
{
'name': 'Dyna',
'email': 'Dyna@gmail.com',
'city': 'New York',
'phone': 12345666
}
]

我尝试了以下解决方案,但它只过滤任何一个过滤记录

var filteredArray_1 = result.filter(function(itm){
return searchByname.indexOf(itm.name) > -1;
});
var filteredArray_2 = result.filter(function(itm){
return searchByEmail.indexOf(itm.email) > -1;
});
var filteredArray_3 = result.filter(function(itm){
return searchByCity.indexOf(itm.city) > -1;
});
let finalArray = [...filteredArray_1, ...filteredArray_2, ...filteredArray_3];

预期输出

var result = [
{
'name': 'john',
'email': 'john@gmail.com',
'city': 'CA',
'phone': 425663313
},
{
'name': 'test1',
'email': 'test1@gmail.com',
'city': 'LA',
'phone': 7418669633
},
]

您的过滤器包括任何通过过滤器的结果,并且可以包括两次结果。

相反,将所有过滤器一起应用:

const searchByname = ['john', 'test1'];
const searchByEmail = ['john@gmail.com', 'test1@gmail.com'];
const searchByCity = ['CA', 'LA'];
const result = [
{
'name': 'john',
'email': 'john@gmail.com',
'city': 'CA',
'phone': 425663313
},
{
'name': 'test1',
'email': 'test1@gmail.com',
'city': 'LA',
'phone': 7418669633
},
{
'name': 'Dyna',
'email': 'Dyna@gmail.com',
'city': 'New York',
'phone': 12345666
}, 
undefined, // Dummy test empty
{ } // Dummy test with no properties
];
const multifiltered = result.
filter(itm => searchByname.indexOf(itm?.name) > -1).
filter(itm => searchByEmail.indexOf(itm?.email) > -1).
filter(itm => searchByCity.indexOf(itm?.city) > -1);

console.log('Multiple filters', multifiltered);
// However, your code will be easier to read if you do a single operation...
const filteredAND = result.
filter(itm => 
itm &&
searchByname.indexOf(itm.name) > -1 &&
searchByEmail.indexOf(itm.email) > -1 &&
searchByCity.indexOf(itm.city) > -1);

console.log('AND filters', filteredAND);
const filteredOR = result.
filter(itm => 
itm && (
searchByname.indexOf(itm.name) > -1 ||
searchByEmail.indexOf(itm.email) > -1 ||
searchByCity.indexOf(itm.city) > -1));

console.log('OR filters', filteredOR);

我不确定我是否完全理解你的问题。

但是你可以用这种方式过滤

var filtered = result.filter(
(item) =>
searchByname.includes(item.name) ||
searchByEmail.includes(item.email) ||
searchByCity.includes(item.city)
);

这会给你想要的结果

您可以根据自己的需求尝试其中的任何一种,

let andFiltered = result.filter(
(data) =>
searchByname.includes(data.name) &&
searchByEmail.includes(data.email) &&
searchByCity.includes(data.city)
);
console.log(andFiltered);
let orFiltered = result.filter(
(data) =>
searchByname.includes(data.name) ||
searchByEmail.includes(data.email) ||
searchByCity.includes(data.city)
);
console.log(orFiltered);

最新更新