我正在使用 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 属性更改为可枚举?
正如其他人之前所说,如果属性不可枚举,则
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