Json.stringify() 在 xlsx.sheet_to_json

问题描述 投票:0回答:1

我正在使用 SheetJs 库读取 Excel 文件。

 const data = XLSX.utils.sheet_to_json(workbook.Sheets[sheet])

返回这样的对象。

{webShop: 'AR_APPD-72642_RDS_Retailer_User', __EMPTY: '',
  webShop: ""
  __EMPTY: ""
  __EMPTY_2: "AR_APPD-72642_RDS_Retailer_User (Prod)"
  __EMPTY_3: "AR_APPD-72642_RDS_Retailer_User (Prod) "
  __EMPTY_4: "RtailerUI"
  __EMPTY_5: "RtailerUI"
  __rowNum__: 58

忽略其他属性。

属性rowNum由sheet_to_json函数创建,并返回对象的Excel行号。

然后我使用

JSON.stringify
创建单个 Excel 工作表的 JSON 字符串。我将其字符串连接到上一张纸。

this.convertedJson= this.convertedJson +JSON.stringify(data,undefined, 4);

现在是我遇到的问题。使用

.stringify()
后,我会返回不同行拥有的每个属性,除了 rowNum

这是上面对象的输出字符串的一部分。

{
        "WebShop": "AR_APPD-72642_RDS_RetailerUI_User",
        "__EMPTY": "",
        "__EMPTY_2": "AR RDS Retailer UI User (Prod)",
        "__EMPTY_3": "AR RDS Retailer UI User (Prod) ",
        "__EMPTY_4": "RtailerUI",
        "__EMPTY_5": "RtailerAI"
    }

我发现了 SheetJs 的较旧变更日志,其中我注意到 rowNum 属性已从可枚举更改为不可枚举。跟进这一线索,显然您无法使用 .stringify() 序列化不可枚举属性。有谁知道一个简单的解决方案如何我仍然可以将 .stringify() 与不可枚举属性一起使用。或者我如何将每个对象的所有 rowNum 属性更改为可枚举?

javascript json serialization
1个回答
0
投票

正如其他人之前所说,如果属性不可枚举,则

JSON.stringify
不会选择它。因此,您需要按照 @Keith 的方式复制每个对象,或者按照 @Barmar 的方式将属性重新定义为可枚举。

我想在这里补充一下,如果您选择重新定义属性,并且该属性是否可配置

事先知道属性的名称,您可以添加自定义字符串化函数

nonEnumStringify = (obj) => {
const nonEnumObj = JSON.stringify(obj, (key, val) => {
    if (!key) {
        if (typeof val === 'object' && val.hasOwnProperty('__rowNum__')) {
            Object.defineProperty(val, '__rowNum__', {
                value: val.__rowNum__,
                enumerable: true,
            });
        }
    }
    return val;
});
return nonEnumObj;}

然后只需调用

nonEnumStringify(data)
而不是标准
JSON.stringify

© www.soinside.com 2019 - 2024. All rights reserved.