使用JSON.stringify序列化SheetJs对象时丢失__rowNum__属性的解决方法
解决SheetJS rowNum 无法被JSON.stringify序列化的问题
方法1:使用JSON.stringify的replacer函数主动包含__rowNum__
直接在JSON.stringify中传入自定义replacer,遍历每个对象时手动提取非枚举的__rowNum__属性:
const data = XLSX.utils.sheet_to_json(workbook.Sheets[sheet]); const jsonStr = JSON.stringify(data, (key, value) => { if (typeof value === 'object' && value !== null && '__rowNum__' in value) { // 复制原对象并添加可枚举的__rowNum__ return { ...value, __rowNum__: value.__rowNum__ }; } return value; });
这个方法不需要修改原数据,通过replacer在序列化过程中动态补充属性,适合不想改动原始数据的场景。
方法2:将__rowNum__转为枚举属性(修改原数据)
遍历数据数组,用Object.defineProperty把每个对象的__rowNum__设置为可枚举:
const data = XLSX.utils.sheet_to_json(workbook.Sheets[sheet]); data.forEach(item => { if ('__rowNum__' in item) { Object.defineProperty(item, '__rowNum__', { enumerable: true, value: item.__rowNum__ }); } }); // 现在JSON.stringify可以正常序列化__rowNum__了 const jsonStr = JSON.stringify(data);
这种方法直接修改原始对象的属性描述符,后续任何序列化操作都能包含该属性,适合需要多次使用处理后数据的场景。
内容的提问来源于stack exchange,提问作者rugratjayo
相关产品推荐
相关产品推荐

