基于另一列表子串过滤列表:includes方法失效的解决方法
列表过滤功能实现问题
我尝试用includes方法实现列表过滤,但即便目标列表里存在匹配的子串,对应项也没被移除。以下是我的代码、实际输出和预期输出,求正确实现方法:
function new_eps(){ var ss = SpreadsheetApp.getActive().getSheetByName('series'); var new_optts = [['CSI: Vegas\nS2E16 - LEG§§§ccc§§§ddd'],['The Ark\nS1E06 - LEG§§§aaa§§§bbb']]; var col_g = ss.getRange('G1:G').getValues(); var col_g_flat = col_g.flat(); // ['CSI: Vegas\nS2E16 - LEG§§§eee§§§fff','The Last of Us\nS1E09 - DUB§§§ggg§§§hhh']; var not_match = new_optts.filter(x => !col_g_flat.includes(x[0].substring(0, x[0].indexOf('§§§')))); console.log(not_match); }
实际输出
[ [ 'CSI: Vegas\nS2E16 - LEG§§§ccc§§§ddd' ], [ 'The Ark\nS1E06 - LEG§§§aaa§§§bbb' ] ]
预期输出
(因为CSI: Vegas\nS2E16 - LEG是col_g_flat中某一项的子串)
[ [ 'The Ark\nS1E06 - LEG§§§aaa§§§bbb' ] ]
问题原因与解决方法
当前代码用col_g_flat.includes(...)是检查数组中是否有完全等于目标前缀的元素,但实际需求是判断col_g_flat里的项是否包含该前缀子串,逻辑不匹配导致过滤失效。
正确做法是用some方法遍历col_g_flat,检查是否存在元素包含目标前缀:
function new_eps(){ var ss = SpreadsheetApp.getActive().getSheetByName('series'); var new_optts = [['CSI: Vegas\nS2E16 - LEG§§§ccc§§§ddd'],['The Ark\nS1E06 - LEG§§§aaa§§§bbb']]; var col_g = ss.getRange('G1:G').getValues(); var col_g_flat = col_g.flat(); // ['CSI: Vegas\nS2E16 - LEG§§§eee§§§fff','The Last of Us\nS1E09 - DUB§§§ggg§§§hhh']; var not_match = new_optts.filter(item => { const targetPrefix = item[0].substring(0, item[0].indexOf('§§§')); // 检查col_g_flat中是否有元素包含目标前缀 const hasMatchingItem = col_g_flat.some(gItem => gItem.includes(targetPrefix)); // 返回不匹配的项 return !hasMatchingItem; }); console.log(not_match); }
核心说明:
Array.prototype.includes():判断数组是否存在完全等于目标值的元素,不支持子串匹配;Array.prototype.some():遍历数组,只要有一个元素满足gItem.includes(targetPrefix)(即包含目标子串),就返回true,正好符合需求。
内容的提问来源于stack exchange,提问作者Digital Farmer
相关产品推荐
相关产品推荐

