多API调用JSON合并与按自定义ID顺序提取MD5值问题
解决多JSON合并并按指定ID顺序获取MD5值的问题
我看了你遇到的问题——要从多个JSON文件里按指定ID顺序提取对应的MD5值,现在的合并逻辑出了点小问题,我来帮你修正一下。
先梳理现有代码的问题
js变量未初始化,直接调用concat会抛出错误- 没有正确将多个JSON中的
posts数组合并到统一集合中 - 后续用
find遍历查找效率较低,尤其是数据量较大时
修正后的解决方案
我们可以先把所有JSON文件里的posts合并成一个数组,再创建一个ID到MD5的映射对象(大幅提升查找效率),最后按指定ID顺序提取对应的MD5值即可。
// 初始化存储所有posts的数组 const allPosts = []; // 你指定的ID顺序 const ids = [2227726,2277,2218681,22881,6659,2236659]; // 循环获取并合并多个JSON的posts for (let page = 1; page <= 2; page++) { // 对应你原来的page<3,改成<=2更直观 const url = `https://some.url/to/json${page}.json`; const xhr = new XMLHttpRequest(); // 注意要实例化XHR对象,你原代码漏了这一步 xhr.open('GET', url, false); xhr.send(); const json = JSON.parse(xhr.responseText); // 将当前JSON的posts合并到allPosts中 allPosts.push(...json.posts); } // 创建ID到MD5的映射对象,方便快速查找 const idToMd5 = {}; allPosts.forEach(post => { idToMd5[post.id] = post.file.md5; }); // 按指定ID顺序获取对应的MD5值 const md5 = ids.map(id => idToMd5[id]); console.log(md5); // 输出:["12","34","56","78","90","100"]
关键逻辑说明
- 合并posts数组:用
push(...json.posts)把每个JSON里的posts元素都添加到allPosts数组中,得到所有帖子的统一集合。 - 创建映射对象:遍历所有帖子,把
id作为键、对应的md5作为值存入idToMd5,后续查找时直接通过idToMd5[id]就能拿到结果,比每次用find遍历数组高效得多。 - 按顺序提取:用
map遍历指定的ids数组,从映射对象中取出对应MD5,就能得到你想要的顺序结果。
另外补充:同步XHR(open第三个参数为false)在现代浏览器可能存在性能问题,甚至被部分环境限制,如果场景允许,建议改成异步方式(比如fetch+async/await),但如果必须用同步,上面的代码也能正常运行。
内容的提问来源于stack exchange,提问作者Tofi
相关产品推荐
相关产品推荐

