Typescript对象数组多条件过滤问题:multiFilter函数不生效
解决多条件数组过滤不生效的问题
看起来你的核心需求是同时匹配多个过滤条件:既要name包含filters.name里的任意关键词,又要city属于filters.city里指定的城市。问题大概率出在你自定义的multiFilter函数逻辑上——比如可能做了完全匹配而非部分匹配,或者没有正确处理多条件的“与”关系。
下面是一个经过验证的实现方案,直接替换你的multiFilter函数即可:
function multiFilter(items, filters) { // 遍历所有待过滤的项 return items.filter(item => { // 遍历所有过滤条件,确保每一个条件都满足 return Object.entries(filters).every(([key, allowedValues]) => { if (key === 'name') { // 针对name字段:检查item的name是否包含allowedValues中的任意一个字符串 return allowedValues.some(value => item[key].includes(value)); } else { // 针对其他字段(比如city):检查item的字段值是否在允许的数组里 return allowedValues.includes(item[key]); } }); }); } // 你的原始数据 let filters = { name: ["Krishna", "Naveen"], city : ["London"] }; let results = [ { "name": "Krishna#Surname", "city": "London", "age": 23 }, { "name": "Naveen#Surname", "city": "London", "age": 23 }, { "name": "Krishna#Surname", "city": "NewYork", "age": 23 }, { "name": "Praveen#Surname", "city": "Washington", "age": 23 } ]; // 调用过滤函数 const filteredResults = multiFilter(results, filters); console.log(filteredResults);
代码逻辑说明:
Object.entries(filters).every(...):确保所有过滤条件都必须满足(逻辑“与”),比如必须同时符合name和city的要求。name字段的特殊处理:因为你的results里的name是带后缀的(比如Krishna#Surname),所以用includes()做部分匹配,而不是严格相等。- 其他字段的通用处理:比如
city直接用includes()检查是否在允许的数组中,适合严格匹配的场景。
运行结果:
执行后会得到符合要求的前两条数据:
[ { name: 'Krishna#Surname', city: 'London', age: 23 }, { name: 'Naveen#Surname', city: 'London', age: 23 } ]
如果你的原始multiFilter函数是做了严格相等匹配(比如item[key] === value),那自然会过滤不到结果——因为Krishna#Surname和Krishna并不完全相等,这应该就是你之前代码不生效的核心原因。
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

