<header> SWAPI Links </header> <body> <script> const improovedFetch = async (url) => { let lukeRes = await fetch(url); let luke = await lukeRes.json(); let result = {}; let retrievers = []; let valueArr = []; for (let key in luke) { let value = luke[key]; let isArray = Array.isArray(value); if (typeof value == "string") { valueArr.push(value); } else if (isArray) { valueArr = value.filter(val => typeof val == "string"); } valueArr = valueArr.filter(val => val.startsWith("https://swapi.dev/api/")); if (valueArr.length > 0) { for (let urlStr of valueArr) { retrievers.push(fetch(urlStr) .then(res => res.json()) .then( res => { let result = { key: key, val: res, isArray: isArray }; return result; })); } } else { result[key] = value; } } let results = [result, ...await Promise.all(retrievers)]; results.reduce((a, v) => { let { key, val, isArray } = v; if (isArray) { let aVal = a[key]; if (!aVal) a[key] = aVal = []; aVal.push(val); } else { a[key] = val; } return a; }); return result; } improovedFetch('https://swapi.dev/api/people/20/').then( res => res ) .then( res => console.log(JSON.stringify(res,null,4)) ); </script> </body>