如何用ES6在对象数组中搜索字符串并返回匹配对象?
问题分析与解决方案
咱们先拆解一下你代码里的问题,然后给出修复后的实现:
为什么会报错?
forEach无法给filter提供判断条件:forEach没有返回值,所以你的filter回调函数永远返回undefined(相当于false),根本不会过滤出任何结果,这也是你看不到匹配对象的核心原因。match返回null时访问length报错:当目标字符串里没有'low'时,match('low')会返回null,你直接去取null.length就会触发Cannot read property 'length' of null这个错误。- 多余的
length > 1条件:你只是想检查是否包含'low',这个条件会把只出现一次'low'的情况排除掉,不符合你的需求。
修复后的代码
如果你想筛选出所有在defConfigs指定的字段中包含'low'(不区分大小写)的对象,用下面的代码:
// 筛选所有匹配的对象 const filteredItems = items.filter(item => defConfigs.some(def => { // 先检查字段存在且值不为null/undefined if (!(def.key in item) || item[def.key] == null) { return false; } const valueStr = item[def.key].toString().toLowerCase(); // 用includes检查是否包含目标字符串,安全又直观 return valueStr.includes('low'); }) ); // 如果你只需要第一个匹配的对象(就是你提到的标题为"Follow-up after INC000000004507"的那个),用find代替filter: const firstMatchingItem = items.find(item => defConfigs.some(def => { if (!(def.key in item) || item[def.key] == null) { return false; } const valueStr = item[def.key].toString().toLowerCase(); return valueStr.includes('low'); }) ); console.log(filteredItems); // 输出3个符合条件的对象 console.log(firstMatchingItem); // 输出你期望的第一个匹配对象
关键改进点说明
- 用
Array.some()替代forEach:some会遍历defConfigs,只要有一个字段匹配条件就返回true,正好满足filter需要的布尔判断逻辑。 - 增加空值检查:避免
item[def.key]为null(比如description字段)时调用toString()出错。 - 用
String.includes()替代match():includes直接返回布尔值,不需要处理null的情况,比match更适合做“是否包含”的判断。如果一定要用match,可以写成valueStr.match(/low/) !== null,但includes更简洁。 - 按需选择
filter或find:filter返回所有匹配的对象数组,find只返回第一个匹配的对象,根据你的需求选就行。
内容的提问来源于stack exchange,提问作者Valay
相关产品推荐
相关产品推荐

