如何高效判断一维数组是否存在于二维数组?解决循环超时问题
问题分析与解决方案
原代码的问题
你用new_element in events_array的方式完全错误,in操作符的作用是检查某个值是否是数组(或对象)的键名(比如数组的索引0、1、2),而不是判断子数组元素是否存在。所以不管你的new_element内容和数组里的子数组有多像,这个判断都会返回false,导致控制台一直输出“Does not exist”。
高效判断方法
以下两种方法都无需手动写循环(底层经引擎优化,比手动循环更快),适合大数据量场景:
方法一:使用Array.some()+数组相等判断
some()会遍历数组直到找到符合条件的元素,配合辅助函数判断两个数组是否完全相等:
// 辅助函数:判断两个数组是否完全相等 function arraysEqual(arr1, arr2) { if (arr1.length !== arr2.length) return false; for (let i = 0; i < arr1.length; i++) { if (arr1[i] !== arr2[i]) return false; } return true; } function myFunction(){ let events_array = [ [ 'vahsonqmvl80jligsncdb7amk0@google.com', 'Oregon IRC', '6/1/2022','Old' ], [ 'vahsonqmvl80jligsncdb7amk0@google.com', 'Oregon IRC', '6/1/2023','Old' ], [ 'vahsonqmvl80jligsncdb7amk0@google.com', 'Oregon IRC', '6/1/2024','Old' ] ]; const new_element = [ 'vahsonqmvl80jligsncdb7amk0@google.com', 'Oregon IRC', '6/1/2023','Old' ]; const exists = events_array.some(item => arraysEqual(item, new_element)); console.log(exists ? 'Exist' : 'Does not exist'); }
方法二:用哈希集合(Set)优化查找性能
如果需要频繁执行查找操作,推荐先将所有子数组序列化为唯一字符串,存入Set集合。Set的has()方法查找时间复杂度为O(1),比循环遍历高效得多:
function myFunction(){ let events_array = [ [ 'vahsonqmvl80jligsncdb7amk0@google.com', 'Oregon IRC', '6/1/2022','Old' ], [ 'vahsonqmvl80jligsncdb7amk0@google.com', 'Oregon IRC', '6/1/2023','Old' ], [ 'vahsonqmvl80jligsncdb7amk0@google.com', 'Oregon IRC', '6/1/2024','Old' ] ]; // 预先将子数组序列化为字符串存入Set const eventSet = new Set(events_array.map(item => JSON.stringify(item))); const new_element = [ 'vahsonqmvl80jligsncdb7amk0@google.com', 'Oregon IRC', '6/1/2023','Old' ]; const exists = eventSet.has(JSON.stringify(new_element)); console.log(exists ? 'Exist' : 'Does not exist'); }
注意:
JSON.stringify对数组元素的顺序敏感,如果子数组元素顺序不同但你需要判定为相同,可先对数组元素排序再序列化。
内容的提问来源于stack exchange,提问作者alyssaeliyah
相关产品推荐
相关产品推荐

