如何实现筛选并排序数组中为另一数组元素子串的元素?代码调试求助
Codewars Kata 问题排查
这是来自codewars的Kata练习:给定两个字符串数组a1和a2,返回按字典序排序的数组r,r中的元素是a1中属于a2某一元素子串的字符串。
示例1:
a1 = ["arp", "live", "strong"] a2 = ["lively", "alive", "harp", "sharp", "armstrong"]
返回 ["arp", "live", "strong"]
示例2:
a1 = ["tarp", "mice", "bull"] a2 = ["lively", "alive", "harp", "sharp", "armstrong"]
返回 []
以下是我目前编写的代码,怀疑第4行的if (a2.includes(a1[i]))存在问题,请求帮助排查:
function inArray(a1,a2){ let r =[]; for (let i =0; i> a1.length; i++){ if (a2.includes(a1[i])){ r.push(a1[i]) } } r = r.sort() return r }
问题排查与修正
循环条件完全写反
第3行的i > a1.length是错误的,循环永远不会执行——初始i是0,0不可能大于数组长度,直接导致返回空数组。正确条件应该是i < a1.length。子串判断逻辑错误
a2.includes(a1[i])是判断a1的元素是否是a2数组里的完整成员,但题目要求的是a1元素是a2中某个元素的子串(比如"arp"是"harp"的子串,但不是a2的直接元素)。要实现正确判断,应该检查a2中是否存在任意字符串包含当前a1元素,用a2.some(str => str.includes(a1[i]))替代原判断。
修正后的代码
function inArray(a1,a2){ let r = []; for (let i = 0; i < a1.length; i++){ if (a2.some(str => str.includes(a1[i]))){ r.push(a1[i]); } } r.sort(); return r; }
也可以用更简洁的链式写法:
function inArray(a1,a2){ return a1.filter(str => a2.some(item => item.includes(str))).sort(); }
内容的提问来源于stack exchange,提问作者Faultier321
相关产品推荐
相关产品推荐

