无法为现有JSON的ocrData添加paymentTerms属性,求技术解决方法
问题:无法为JSON的ocrData节点新增paymentTerms属性
点击保存按钮时,通过traverseData函数收集表单数据并更新JSON,但无法给invoice下的ocrData节点添加paymentTerms属性,希望在destination字段后新增该属性。
现有处理函数
function traverseData(data, obj, newValue) { for (var k in data) { if (data.hasOwnProperty(k) && typeof data[k] == "object") { data[k] = traverseData(data[k], obj, newValue); console.log("k="+k+", obj="+obj); } else if (k == obj) { data[k] = newValue; } } return data }
目标JSON结构
{ "invoice": { "ocrData": { "invoiceNumber": "FM334J", "paymentDate": "Feb 24 , 2022", "sellerName": "Q FOTURE LTD", "sellerPhone": "+ 004154", "sellerAddress": "ROOM 1010", "sellerEmail": "", "sellerFax": "0088960", "sellerWebsite": "", "bankName": "S P DEVELOPMENT BANK", "bankAccountNumber": "00819", "bankAddress": "bank address", "ibanCode": "", "swiftCode": "SP0", "paymentCurrency": "USD", "paymentAmount": "60.00", "buyerName": "C TRADING", "buyerAddress": "44 AVE", "buyerWebsite": "website", "buyerAccountNumber": "0000819", "portOfLoading": "Casmora", "shipmentDate": "", "destination": "DAKAR", "paymentTerms": "", // 需要新增的属性 "currencySettlement": "XOF" }, "products": [ { "productDescription": "1 * 25KG BAG , 2FCL" } ], "results": [ { "line": [ { "field": "seller_phone", "fieldValue": "+ 008154" }, { "field": "invoice_number", "fieldValue": "FM334J" }, { "field": "buyer_name", "fieldValue": "C TRADING" }, { "field": "seller_name", "fieldValue": "Q FOTURE LTD" }, { "field": "seller_name", "fieldValue": "Q FOTURE LTD" }, { "field": "seller_fax_number", "fieldValue": "008960" }, { "field": "invoice_date", "fieldValue": "Feb 24 , 2022" }, { "field": "buyer_address", "fieldValue": "44 AVE" }, { "field": "seller_address", "fieldValue": "ROOM 1010" }, { "field": "seller_address", "fieldValue": "NO.I, DAO" }, { "field": "currency", "fieldValue": "USD" }, { "field": "bank_account_number", "fieldValue": "6000819" }, { "field": "seller_website", "fieldValue": "www.fotoup.com" }, { "field": "invoice_amount", "fieldValue": "60000" }, { "field": "bank_name", "fieldValue": "SHA DEVELOPMENT BANK" }, { "field": "table", "fieldValue": "table" } ], "tableItem": [ { "tableItem": "Description", "tableItemValue": "1 * 25KG BAG , 2FCL" } ] } ] } }
问题原因
原traverseData函数仅能遍历并更新已存在的属性:只有当遍历到的键k等于目标属性obj时,才会赋值。而paymentTerms是新增属性,原本不在ocrData中,因此函数不会处理该属性。
解决方案
方法1:直接定位节点添加(推荐,高效简洁)
既然明确知道目标节点路径是invoice.ocrData,可以直接操作该对象,同时保证paymentTerms在destination之后(现代浏览器/Node.js遵循对象属性插入顺序):
// 假设你的JSON数据存储在变量data中 const ocrData = data.invoice.ocrData; // 重新构建ocrData,确保paymentTerms在destination之后 data.invoice.ocrData = Object.fromEntries( Object.entries(ocrData).flatMap(([key, value]) => { const entries = [[key, value]]; // 遍历到destination时,插入paymentTerms if (key === "destination") { entries.push(["paymentTerms", "你的付款条款值"]); // 替换为实际值 } return entries; }) );
方法2:修改traverseData函数支持新增
如果需要保留遍历逻辑,修改函数以支持新增属性并指定插入位置:
function traverseData(data, obj, newValue, insertAfterKey = null) { // 先遍历子对象 for (var k in data) { if (data.hasOwnProperty(k) && typeof data[k] === "object") { data[k] = traverseData(data[k], obj, newValue, insertAfterKey); } } // 处理新增属性:判断当前对象是否包含目标插入位置的键 if (insertAfterKey && data.hasOwnProperty(insertAfterKey)) { const newObj = {}; // 遍历原有属性,插入目标属性 for (const key in data) { newObj[key] = data[key]; if (key === insertAfterKey) { newObj[obj] = newValue; } } return newObj; } // 原有更新逻辑:修改已存在的属性 if (data.hasOwnProperty(obj)) { data[obj] = newValue; } // 如果没有指定插入位置或插入位置不存在,直接添加到末尾 if (!insertAfterKey && !data.hasOwnProperty(obj)) { data[obj] = newValue; } return data; } // 使用示例:在destination后添加paymentTerms traverseData(yourJsonData, "paymentTerms", "Net 30", "destination");
内容的提问来源于stack exchange,提问作者Kode Lerner
相关产品推荐
相关产品推荐

