You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:08:45