排查:判断数组元素是否全存在于另一数组的代码始终返回false
问题排查:音频文件名匹配失败的原因及修复方案
问题原因分析
你这段代码的核心问题在于匹配逻辑搞反了匹配对象:
你用result.includes(r)的时候,includes是在检查result数组里有没有完全等于r(也就是unorderedPhrases里的短语文本)的元素,但result里存的都是完整的URL字符串,比如"https://example.com/test/unordered/i was sent to earth to protect you_A/i was sent.mp3",和短语文本'i was sent'完全不是一回事,所以每一次判断都会返回false,最终整个函数自然返回false。
修复方案
我们需要调整逻辑:检查unorderedPhrases里的每一个短语,是否都能在result的某个URL中找到对应的音频文件名。这里提供两种实现方式,按需选择:
方式一:直接检查URL是否包含短语+后缀(简单直接)
let result = [ "https://example.com/test/unordered/i was sent to earth to protect you_A/i was sent.mp3", "https://example.com/test/unordered/i was sent to earth to protect you_A/to earth.mp3", "https://example.com/test/unordered/i was sent to earth to protect you_A/to protect you.mp3", ]; const unorderedPhrases = [ 'i was sent', 'to earth', 'to protect you' ]; function checkResults(){ // 确保每个短语都能在至少一个URL中找到对应的音频 return unorderedPhrases.every(phrase => result.some(url => url.includes(`${phrase}.mp3`)) ); } console.log(checkResults()) // 现在会正确返回true
方式二:提取文件名后精确匹配(更严谨)
如果担心URL路径中出现和短语相同的文本导致误判,可以先提取每个URL的文件名,再和短语精确匹配:
function checkResults(){ return unorderedPhrases.every(phrase => result.some(url => { // 从URL中提取不带后缀的文件名 const filename = url.split('/').pop().replace('.mp3', ''); return filename === phrase; }) ); }
逻辑说明
every方法:保证unorderedPhrases里的每一个短语都必须满足匹配条件,只要有一个不满足就返回falsesome方法:保证至少有一个URL能匹配当前短语,只要找到一个符合的就会返回true
这样当result缺少某个短语对应的音频时,some会返回false,进而every也返回false,完全符合你的需求。
内容的提问来源于stack exchange,提问作者foxer
相关产品推荐
相关产品推荐

