如何高效拆分与过滤两个数组?按指定前缀筛选arr2元素存入op_array
解决方案
先说说你现有代码的问题:
arr2是数组,不能直接调用split()方法,得遍历每个元素处理- 逻辑方向错了:你要筛选的是
arr2里的元素,不是arr1,原代码用arr1.filter完全偏离需求 - 前缀在
~前面,split 后应该取索引[0]而非[1]
基础实现(单次查询场景)
如果只是偶尔查一次,用 Array.filter 结合字符串 startsWith 方法最直观高效:
const arr1 = ['A','B','C','D'] const arr2 = ['A~XX','A~XXX','B~YY','B~YYY'] function getItemsByPrefix(prefix) { // 检查元素是否以「前缀~」开头 return arr2.filter(item => item.startsWith(`${prefix}~`)); } // 测试示例 console.log(getItemsByPrefix('A')); // ['A~XX','A~XXX'] console.log(getItemsByPrefix('B')); // ['B~YY','B~YYY'] console.log(getItemsByPrefix('C')); // []
startsWith 是原生字符串方法,内部实现比手动 split 再比较更高效。
高效预处理(多次查询场景)
如果需要频繁按前缀查询,建议先对 arr2 做一次预处理,把元素按前缀分组存入 Map,之后查询直接取值,时间复杂度降到 O(1):
const arr1 = ['A','B','C','D'] const arr2 = ['A~XX','A~XXX','B~YY','B~YYY'] // 预处理:仅需执行一次 const prefixGroupMap = new Map(); arr2.forEach(item => { const [prefix] = item.split('~'); // 解构快速获取前缀 if (!prefixGroupMap.has(prefix)) { prefixGroupMap.set(prefix, []); } prefixGroupMap.get(prefix).push(item); }); // 查询函数 function getItemsByPrefix(prefix) { // 无对应前缀时返回空数组 return prefixGroupMap.get(prefix) || []; } // 测试示例 console.log(getItemsByPrefix('A')); // ['A~XX','A~XXX'] console.log(getItemsByPrefix('B')); // ['B~YY','B~YYY']
这种方式适合多次查询的场景,预处理一次后,后续查询几乎没有性能开销。
内容的提问来源于stack exchange,提问作者Curious_learner
相关产品推荐
相关产品推荐

