javascript中可通过实现[symbol.iterator]方法使表格对象支持按列迭代,即对每列所有行值组成数组依次返回,兼容for...of和扩展运算符;支持对象数组与二维数组输入,自动提取列名或索引,处理不规则数据并补undefined。

JavaScript中可以通过为表格数据对象实现[Symbol.iterator]方法,返回一个按列遍历的迭代器,从而支持for...of、扩展运算符等原生迭代语法。
理解表格数据结构与列遍历需求
普通表格数据通常表现为二维数组或对象数组(如[{a:1,b:2},{a:3,b:4}]),默认按行迭代。按列读取意味着:对第0列所有行取值 → 第1列 → …… 直到最后一列。关键在于把“列索引”作为迭代状态,每次next()返回该列全部单元格组成的数组(或生成器产出单个值)。
实现可迭代的列模式表格类
定义一个ColumnTable类,接收原始数据(支持数组或对象数组),在[Symbol.iterator]中返回列迭代器:
- 若输入是对象数组(如
[{name:'Alice',age:25},{name:'Bob',age:30}]),先提取字段名作为列头,再按字段顺序逐列提取值 - 若输入是二维数组(如
[[1,2,3],[4,5,6]]),则按索引0~maxColLength-1逐列取值,自动处理不规则行(缺失项补undefined) - 迭代器
next()每次返回{value: [col0Row0, col0Row1, ...], done: false},直到列数耗尽
代码示例:支持对象数组的列迭代器
注意字段顺序稳定性——使用Object.keys(data[0])获取首行键名,确保列序一致:
class ColumnTable {
constructor(data) {
this.data = Array.isArray(data) ? data : [];
this.columns = data.length > 0
? Object.keys(data[0])
: [];
}
*[Symbol.iterator]() {
for (const key of this.columns) {
yield this.data.map(row => row[key]);
}
}
}
// 使用
const table = new ColumnTable([
{ name: 'Alice', score: 85, city: 'Beijing' },
{ name: 'Bob', score: 92, city: 'Shanghai' }
]);
for (const column of table) {
console.log(column); // ['Alice','Bob'] → [85,92] → ['Beijing','Shanghai']
}
进阶:支持按需生成、跳过空列或自定义列顺序
可在构造时传入columns显式指定列序,避免依赖首行字段顺序;也可在迭代器中过滤掉全undefined的列:
- 传入
new ColumnTable(data, ['score', 'name'])强制按指定列序迭代 - 在
yield前加判断:if (column.some(v => v !== undefined)) yield column; - 若需惰性逐单元格产出(而非整列数组),改用
yield*委托一个按行列双循环的生成器
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











