如何在二维数组中使用indexOf?解决判断结果全为false的问题
二维数组中使用indexOf无效的问题解决
问题原因
JavaScript中数组属于引用类型,indexOf 方法通过**严格相等(===)**判断元素是否存在。两个内容完全相同的数组,它们在内存中的引用地址是不同的,因此 arrA.indexOf(arrB[i]) 永远返回 -1,导致你的判断逻辑失效。
解决方案
以下是几种可行的解决方法:
方法一:将数组转为字符串后匹配
利用JSON.stringify把数组转为字符串,内容相同的数组会生成相同的字符串,再通过字符串匹配判断存在性:
let answer = []; let arrA = [[1, 4], [3, 4], [3, 10]]; let arrB = [[1, 4], [1, 10], [3, 4], [3, 10]]; // 预先转换arrA元素为字符串,减少重复计算 const arrAstr = arrA.map(item => JSON.stringify(item)); for (let i = 0; i < arrB.length; i++) { const currentStr = JSON.stringify(arrB[i]); if (!arrAstr.includes(currentStr)) { answer.push(arrB[i]); } } console.log(answer); // 输出: [[1, 10]]
注意:此方法适用于数组元素为可JSON序列化的基础类型(数字、字符串、布尔值等),若包含函数、Symbol等不可序列化类型则不适用。
方法二:自定义数组相等判断函数
编写函数逐个比较数组元素,适用于无法序列化的场景:
// 判断两个一维数组是否完全相等 function arraysEqual(a, b) { if (a.length !== b.length) return false; for (let i = 0; i < a.length; i++) { // 若为嵌套数组可添加递归判断,此处假设子元素为基础类型 if (a[i] !== b[i]) return false; } return true; } let answer = []; let arrA = [[1, 4], [3, 4], [3, 10]]; let arrB = [[1, 4], [1, 10], [3, 4], [3, 10]]; for (let i = 0; i < arrB.length; i++) { // 用some判断arrA中是否有匹配的数组 const exists = arrA.some(item => arraysEqual(item, arrB[i])); if (!exists) { answer.push(arrB[i]); } } console.log(answer); // 输出: [[1, 10]]
方法三:使用Set优化查找效率
当数据量较大时,用Set存储转换后的字符串,利用Set的O(1)查找效率提升性能:
let answer = []; let arrA = [[1, 4], [3, 4], [3, 10]]; let arrB = [[1, 4], [1, 10], [3, 4], [3, 10]]; const arrASet = new Set(arrA.map(item => JSON.stringify(item))); for (const item of arrB) { const itemStr = JSON.stringify(item); if (!arrASet.has(itemStr)) { answer.push(item); } } console.log(answer); // 输出: [[1, 10]]
内容的提问来源于stack exchange,提问作者Dongjun Kim
相关产品推荐
相关产品推荐

