TypeScript中有序遍历含数组与对象的大数组并提取ID的优化方案
如何保证异步获取数据后的顺序一致性并优化ID提取代码
你遇到的顺序混乱问题,核心根源不在后续的ID提取逻辑,而是异步数据获取的阶段。当你在Promise.all的每个异步回调里直接调用organisationCompanyTalents.push()时,异步请求的完成速度是不可控的——哪个请求先返回,就会先被塞进数组里,这直接打乱了companyOrganisations原本的遍历顺序,后续的ID自然也跟着乱了。
第一步:修正数据获取逻辑,保证顺序稳定
Promise.all有个非常关键的特性:它返回的结果数组,会严格按照输入Promise数组的顺序排列,完全不受单个Promise完成快慢的影响。我们可以利用这一点,彻底解决顺序问题:
let organisationCompanyTalents = []; if (companyOrganisations.length > 0) { // 先为每个组织生成对应的异步请求Promise const talentPromises = companyOrganisations.map(async org => { try { const companyTalent = await this.ComapanyTalentService.getCompanyTalentByOrganisationId( org._id, companyUser.Company_Id, ); // 有数据就返回格式化后的数组,无数据则返回空数组(保持结构统一) return companyTalent ? Object.values(companyTalent) : []; } catch (error) { throw error; } }); // 等待所有请求完成,结果数组顺序和companyOrganisations完全匹配 organisationCompanyTalents = await Promise.all(talentPromises); }
这样处理后,organisationCompanyTalents的第N个元素,必然对应companyOrganisations的第N个组织的数据,顺序绝对不会乱。
第二步:优化ID提取代码,简洁且保序
原来的嵌套map+手动push的写法可以简化,利用map方法的天生顺序性,一行代码就能完成ID提取:
const companyUserIds = organisationCompanyTalents.map(talentGroup => talentGroup.map(talent => talent.company_user_id) );
map会严格按照原数组的遍历顺序生成新数组,只要organisationCompanyTalents的顺序是对的,companyUserIds的结构和顺序就完全符合你的预期。
现在两个环节都从根源上保证了顺序一致性,再也不会出现大数组/小数组顺序颠倒的问题了。
内容的提问来源于stack exchange,提问作者Shashank Dubey
相关产品推荐
相关产品推荐

