如何在JavaScript中遍历二维数组查找矩阵的列公共元素?
解决矩阵列公共元素问题,以及你的代码错误分析
首先,先拆解你当前代码里的问题,再一步步实现你要的列公共元素功能,顺便聊聊二维数组的遍历方法。
你的代码bug分析
你现在的代码逻辑其实是想找所有行都包含的元素(行公共元素),但实现上有明显漏洞,而且和你要的「列公共元素」不是一回事。
看这段核心循环:
for (j = 1; j < arr.length; j++) { if (arr[j].indexOf(item) !== -1) { b = true } else { b= false } }
这里每次循环都会直接覆盖b的值,导致最后b只反映了最后一行是否包含当前元素,而不是所有行都包含。比如如果前两行都不包含某个元素,但最后一行包含,b会错误地变成true,这显然不符合「所有行都包含」的要求。
另外,你的代码逻辑从根上就没对准「列公共元素」——你是拿第一行的元素去匹配其他行,而列公共元素需要先把矩阵的列转换成行,再处理。
先搞定行公共元素的正确写法(如果需要的话)
如果只是想修正你原本的行公共元素逻辑,正确的做法是:只要有一行不包含当前元素,就直接标记为false并跳出循环,否则保持true。用Set来实现会更简洁:
function commonElementInRows(arr) { // 拿第一行作为初始候选集合 let candidates = new Set(arr[0]); // 遍历剩下的每一行,筛选出同时存在于当前行和候选集合的元素 for (let i = 1; i < arr.length; i++) { candidates = new Set(arr[i].filter(item => candidates.has(item))); // 候选集合为空时提前终止,提升效率 if (candidates.size === 0) break; } return Array.from(candidates); } var arr = [ [1,2,3], [2,1,3], [2,3,1] ] console.log(commonElementInRows(arr)); // 输出 [1,2,3],这三个元素在每一行都存在
实现列公共元素的正确代码
要找列公共元素,核心步骤是先转置矩阵(把原矩阵的列转换成行),然后对转置后的每一行(对应原矩阵的一列)求公共元素。
这里分两种常见需求实现:
需求1:找列中所有行都相同的元素(即整列元素完全一致)
// 转置二维数组:把列转成行 function transposeMatrix(matrix) { return matrix[0].map((_, colIndex) => matrix.map(row => row[colIndex])); } function getColumnSameElements(matrix) { const transposed = transposeMatrix(matrix); const result = []; for (const col of transposed) { // 检查当前列所有元素是否和第一个元素一致 const allSame = col.every(item => item === col[0]); result.push(allSame ? col[0] : null); } return result; } var arr = [ [1,2,3], [2,1,3], [2,3,1] ] console.log(getColumnSameElements(arr)); // 输出 [null, null, null],没有列的所有元素完全相同
需求2:找列中出现次数≥2的公共元素
function getColumnCommonElements(matrix) { const transposed = transposeMatrix(matrix); const result = []; for (const col of transposed) { const countMap = {}; // 统计列中每个元素的出现次数 col.forEach(item => { countMap[item] = (countMap[item] || 0) + 1; }); // 筛选出现次数≥2的元素 const commonItems = Object.keys(countMap) .filter(key => countMap[key] > 1) .map(Number); result.push(commonItems); } return result; } console.log(getColumnCommonElements(arr)); // 输出 [[2], [], [3]],第一列公共元素是2,第三列是3
JavaScript遍历二维数组的常用方法
遍历二维数组有几种常用方式,根据场景选择:
- 嵌套for循环(最基础):
for (let i = 0; i < matrix.length; i++) { for (let j = 0; j < matrix[i].length; j++) { console.log(`行${i}列${j}的元素:${matrix[i][j]}`); } }
- forEach方法(更简洁):
matrix.forEach((row, rowIdx) => { row.forEach((item, colIdx) => { console.log(`行${rowIdx}列${colIdx}的元素:${item}`); }); });
- for...of循环(ES6+,可读性强):
for (const row of matrix) { for (const item of row) { console.log(item); } }
- map转换(比如转置数组时用到的,适合批量处理):
// 转置就是用map遍历列索引,提取每一列的所有元素 const transposed = matrix[0].map((_, colIdx) => matrix.map(row => row[colIdx]));
内容的提问来源于stack exchange,提问作者naveen
相关产品推荐
相关产品推荐

