异步函数导入排序对象数组时属性丢失问题排查
问题:筛选排序后的对象导入后属性丢失
问题场景
生成筛选并排序的对象列表时,原文件内打印的数组包含完整对象属性,但导入到另一文件执行聚合操作后,仅diffPercent属性显示正常数值,其他属性显示为空的[Object]。
相关代码
导出的筛选排序函数
export async function V2V2SORT() { try { const dexdata = await COMPAREV2V2(); const dexdatafilter = dexdata.filter((item): item is any => (item !== undefined && item.v2a.reserve0 > 10 && item.v2b.reserve1 > 10)); const dexdatasorted = dexdatafilter.sort((a, b) => { return b.diffPercent - a.diffPercent; }) console.log(dexdatasorted)//DEBUG return Promise.all(dexdatasorted); } catch (error) { console.log(error); }; } V2V2SORT()
导入聚合的函数
import { V3V2SORT } from './dexdata/V3V2SORT/V3V2SORT'; import { V2V2SORT } from './dexdata/V3V2SORT/V3V2SORT'; import { V2V3SORT } from './dexdata/V3V2SORT/V3V2SORT'; export async function dexSort() { let v3v2 = await V3V2SORT(); let v2v2 = await V2V2SORT(); let v2v3 = await V2V3SORT(); const alldex = [] as any; alldex.push(v3v2); alldex.push(v2v2); alldex.push(v2v3); console.log(alldex); return alldex; } dexSort()
问题原因与修复方案
1. 错误使用Promise.all()
V2V2SORT中返回Promise.all(dexdatasorted)完全多余:dexdatasorted是普通对象数组,不是Promise数组,Promise.all会将每个对象强制包装为已resolve的Promise,这个过程可能破坏对象属性的正常序列化,导致导入后属性丢失。
修复:直接返回排序后的数组
函数本身是async,会自动将返回值包装为Promise,无需额外处理:
export async function V2V2SORT() { try { const dexdata = await COMPAREV2V2(); const dexdatafilter = dexdata.filter((item) => item !== undefined && item.v2a.reserve0 > 10 && item.v2b.reserve1 > 10 ); const dexdatasorted = dexdatafilter.sort((a, b) => { return b.diffPercent - a.diffPercent; }); console.log(dexdatasorted); // DEBUG return dexdatasorted; // 直接返回数组 } catch (error) { console.error(error); return []; // 错误时返回空数组,避免后续处理异常 } } // 按需执行,不需要自动执行可注释掉V2V2SORT();
2. 导入路径错误
三个排序函数都从同一个文件导入,属于笔误,会导致导入重复函数,数据异常。
修复:修正每个函数的导入路径
确保每个函数来自对应的文件:
import { V3V2SORT } from './dexdata/V3V2SORT/V3V2SORT'; import { V2V2SORT } from './dexdata/V2V2SORT/V2V2SORT'; // 修正路径 import { V2V3SORT } from './dexdata/V2V3SORT/V2V3SORT'; // 修正路径
3. 数组聚合方式导致嵌套
原代码用alldex.push(v3v2)会将每个排序函数返回的数组作为单个元素存入alldex,形成嵌套数组,打印时可能显示异常。
修复:展开数组聚合
使用扩展运算符将所有数组合并为一维数组:
export async function dexSort() { const v3v2 = await V3V2SORT(); const v2v2 = await V2V2SORT(); const v2v3 = await V2V3SORT(); const alldex = [...v3v2, ...v2v2, ...v2v3]; // 展开合并 console.log(alldex); return alldex; } // 按需执行,不需要自动执行可注释掉dexSort();
内容的提问来源于stack exchange,提问作者the_prophecy
相关产品推荐
相关产品推荐

