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

无法为现有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:10:33