请求编写从嵌套JS对象提取值并填充PDF表单的脚本
问题描述
我有一个嵌套JS对象,格式如下:
var oNames = { Adobe:{LastUpdate:'03/09/2022',Website:'adobe.com',UserID:'jdoe@gmail.com',PWD:'1234567',PrimaryCC:'',SecondaryCC:'',PrimaryBank:'',SecondaryBank:'',SQ1:'First girlfriend',SA1:'Denise',SQ2:'Grade school attended',SA2:'OLPH',Notes1:'',Notes2:''}, Amazon:{LastUpdate:'10/06/2020',Website:'amazon.com',UserID:'jdoe@gmail.com',PWD:'1234567',PrimaryCC:'Discover',SecondaryCC:'Capital One',PrimaryBank:'',SecondaryBank:'',SQ1:'',SA1:'',SQ2:'',SA2:'',Notes1:'',Notes2:''}, AmericanGiant:{LastUpdate:'01/25/2022',Website:'american-giant.com',UserID:'jdoe@gmail.com',PWD:'1234567',PrimaryCC:'',SecondaryCC:'',PrimaryBank:'',SecondaryBank:'',SQ1:'',SA1:'',SQ2:'',SA2:'',Notes1:'Best Hoodies Made in the USA',Notes2:''}, Asus:{LastUpdate:'11/05/2022',Website:'https://www.asus.com/us/',UserID:'jdoe@gmail.com',PWD:'1234567',PrimaryCC:'',SecondaryCC:'',PrimaryBank:'',SecondaryBank:'',SQ1:'',SA1:'',SQ2:'',SA2:'',Notes1:'Goto for MB & Laptop Computers',Notes2:''}, // ... 其他更多条目 }
需要写一段脚本,通过PDF表单下拉框选中的cName(比如Adobe、Amazon等),匹配对象中的对应条目,把属性值填充到PDF的15个表单字段中(字段名格式为inf.0到inf.14)。
我尝试写了一段代码,但无法正常工作:
for(j=0;j<15;j++){ f=getField("inf."+j); cName = oVendors[event.value][j]; }
解决方案
对象是键值对结构,不能像数组那样用数字索引直接访问,需要先建立属性名和表单字段的对应关系,以下是完整可行的脚本:
完整填充脚本
将这段代码放到PDF表单下拉框的On Change事件中:
// 确保oNames对象已定义(如果已经在其他地方定义,可省略这部分) var oNames = { Adobe:{LastUpdate:'03/09/2022',Website:'adobe.com',UserID:'jdoe@gmail.com',PWD:'1234567',PrimaryCC:'',SecondaryCC:'',PrimaryBank:'',SecondaryBank:'',SQ1:'First girlfriend',SA1:'Denise',SQ2:'Grade school attended',SA2:'OLPH',Notes1:'',Notes2:''}, Amazon:{LastUpdate:'10/06/2020',Website:'amazon.com',UserID:'jdoe@gmail.com',PWD:'1234567',PrimaryCC:'Discover',SecondaryCC:'Capital One',PrimaryBank:'',SecondaryBank:'',SQ1:'',SA1:'',SQ2:'',SA2:'',Notes1:'',Notes2:''}, AmericanGiant:{LastUpdate:'01/25/2022',Website:'american-giant.com',UserID:'jdoe@gmail.com',PWD:'1234567',PrimaryCC:'',SecondaryCC:'',PrimaryBank:'',SecondaryBank:'',SQ1:'',SA1:'',SQ2:'',SA2:'',Notes1:'Best Hoodies Made in the USA',Notes2:''}, Asus:{LastUpdate:'11/05/2022',Website:'https://www.asus.com/us/',UserID:'jdoe@gmail.com',PWD:'1234567',PrimaryCC:'',SecondaryCC:'',PrimaryBank:'',SecondaryBank:'',SQ1:'',SA1:'',SQ2:'',SA2:'',Notes1:'Goto for MB & Laptop Computers',Notes2:''}, // ... 其他条目 }; // 按顺序定义对象属性名与表单字段inf.0到inf.14的对应关系 const fieldMapping = [ 'LastUpdate', 'Website', 'UserID', 'PWD', 'PrimaryCC', 'SecondaryCC', 'PrimaryBank', 'SecondaryBank', 'SQ1', 'SA1', 'SQ2', 'SA2', 'Notes1', 'Notes2' // 若有第15个字段,补充对应的属性名即可 ]; // 获取下拉框选中的商家数据 const selectedData = oNames[event.value]; if (selectedData) { // 循环填充每个表单字段 for (let j = 0; j < fieldMapping.length; j++) { const targetField = getField("inf." + j); if (targetField) { // 从选中的商家对象中取出对应属性值,为空时填空字符串 targetField.value = selectedData[fieldMapping[j]] || ''; } } } else { // 若选中的商家不存在,清空所有表单字段 for (let j = 0; j < fieldMapping.length; j++) { const targetField = getField("inf." + j); if (targetField) { targetField.value = ''; } } }
关键说明
event.value就是下拉框选中的商家名称,直接通过oNames[event.value]即可获取对应的子对象数据。fieldMapping数组用来关联表单字段的索引和对象的属性名,解决对象无法用数字索引访问的问题。- 增加了判断逻辑:如果选中的商家不存在,会自动清空所有表单字段,避免残留旧数据。
selectedData[fieldMapping[j]]用于获取对应属性值,|| ''确保属性值为空时不会填充undefined。
内容的提问来源于stack exchange,提问作者user14825633
相关产品推荐
相关产品推荐

