如何使用嵌套for循环从JSON中取值并为对应字段动态赋值?
错误原因
你写的嵌套循环无法运行,是三个写法错误导致的:
- 错误使用
const关键字:const仅用于声明块级作用域常量,给对象动态挂载属性不需要加const修饰 - 索引与动态键写法错误:内层循环遍历字段定义用的索引是
j,你却用i取subject项;同时obj.subject[i].field是直接取subject数组项的field属性值,没有把field的值作为动态键名使用 - 没有创建行级独立对象:直接往原始
obj.subject上写属性会污染原始字段定义,多轮循环会互相覆盖值
另外你最初手动写的硬编码版本本身还有个手误bug:IsActive字段对应列索引是4,你写成了3,和Gender字段取了同一个位置的值。
修正实现
核心逻辑是每遍历一行value数组,就新建一个独立空对象,遍历subject字段定义时,以每个字段的field值为动态键,对应行的列值为键值存入对象,组装完成的行对象可以直接传给sqlcmd-insert使用。
为了避免subject数组顺序和列顺序不匹配的问题,取值时直接用subject项自带的col属性定位列,比直接用循环索引j更稳妥:
const resultRows = []; for (let rowIdx = 0; rowIdx < obj.value.length; rowIdx++) { // 初始化当前行的空对象 const currentRow = {}; const currentRowData = obj.value[rowIdx]; // 遍历字段定义自动赋值 for (let fieldIdx = 0; fieldIdx < obj.subject.length; fieldIdx++) { const fieldConfig = obj.subject[fieldIdx]; // 动态挂载属性:字段名作为键,对应列的值作为值 currentRow[fieldConfig.field] = currentRowData[fieldConfig.col]; } // 此处currentRow已组装完成,结构为 {Name: 'xxx', Age: xx, ...},可直接执行插入 // 示例:await sqlcmd.insert('your_table', currentRow) resultRows.push(currentRow); }
运行效果
以你给出的示例JSON为例,遍历第一行时生成的currentRow结构如下,完全匹配你手动硬编码赋值的效果,不需要提前声明任何字段变量:
{ Name: "Sam", Age: 30, Country: "US", Gender: "Male", IsActive: "Y" }
后续如果表结构增减字段,只需要修改JSON里的subject配置即可,不需要调整循环逻辑代码。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

