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

如何用ng-repeat遍历二维数组按列取元素生成表格?

解决方案:用AngularJS的ng-repeat实现数组转置表格展示

好问题!其实你有两种可行的方案——既可以完全靠ng-repeat配合模板逻辑实现,也可以先在控制器里转置数组让模板更清爽,我给你详细拆解:

方案1:纯模板实现(无需修改原数组)

这种方案不需要改动你的inputData,直接在模板里通过两层ng-repeat实现行和列的遍历:

步骤1:在控制器中计算最大子数组长度

首先要确定需要生成多少行,也就是所有子数组里最长的那个长度,在控制器里添加:

// 计算所有子数组的最大长度,处理空数组的边界情况
$scope.maxRowCount = $scope.inputData.length > 0 
  ? Math.max(...$scope.inputData.map(subArr => subArr.length)) 
  : 0;

步骤2:模板中嵌套ng-repeat

外层循环遍历行数(用空数组占位),内层循环遍历每个子数组,取对应索引的元素:

<table border="1">
  <!-- 外层循环:生成每一行,对应子数组的索引 -->
  <tr ng-repeat="dummy in [].constructor(maxRowCount) track by $index">
    <!-- 内层循环:遍历每个子数组,取当前行索引对应的元素 -->
    <td ng-repeat="subArr in inputData track by $index">
      {{ subArr[$parent.$index] || '' }}
    </td>
  </tr>
</table>

这里的关键是用$parent.$index获取外层循环的行索引(因为内层ng-repeat会覆盖当前作用域的$index),|| ''是为了处理子数组长度不一致时出现的undefined,显示空字符串更友好。

方案2:控制器中转置数组(模板更简洁)

如果觉得模板里的逻辑有点绕,也可以先在控制器里把inputData转置成“行优先”的数组,再用ng-repeat直接遍历:

步骤1:控制器中转置数组

$scope.transposedData = [];
if ($scope.inputData.length > 0) {
  const maxLen = Math.max(...$scope.inputData.map(subArr => subArr.length));
  // 遍历每个索引,生成转置后的行
  for (let i = 0; i < maxLen; i++) {
    $scope.transposedData.push(
      $scope.inputData.map(subArr => subArr[i] || '')
    );
  }
}

步骤2:模板中直接遍历转置后的数组

模板逻辑就非常直观了:

<table border="1">
  <tr ng-repeat="row in transposedData track by $index">
    <td ng-repeat="val in row track by $index">{{ val }}</td>
  </tr>
</table>

方案对比

  • 纯模板方案:适合不想改动原数据的场景,缺点是模板需要处理$parent和空值,逻辑稍复杂
  • 控制器转置方案:模板更简洁易读,逻辑集中在控制器,适合后续需要复用转置后数据的场景

内容的提问来源于stack exchange,提问作者Matija Župančić

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:50:54