I am using this code to fetch 100 trending public repos on GitHub.
For every language, I calculated the The list of repos using the language, but I can’t calculate the number of repos using this language
part of my code
const api_url = "https://api.github.com/search/repositories?q=created:>30&sort=stars&order=desc&per_page=100"; const response = await fetch(api_url); const data = await response.json(); var urls = data.items .map((a) => ({ language: a.language, url: a.url, })) .filter((el) => { return el.language != null; }), result = urls.reduce((r, { language, url }) => { match = r.find((item) => language in item); match ? match[language].push(url) : r.push({ [language]: [url] }); return r; }, []);
This is sample of my output
[{ "Vala": [ "https://api.github.com/repos/p-e-w/finalterm" ]}, { "Swift": [ "https://api.github.com/repos/louisdh/panelkit", "https://api.github.com/repos/hyperoslo/Whisper", ]}, { "C": [ "https://api.github.com/repos/wishstudio/flinux", "https://api.github.com/repos/Sunzxyong/Tiny" ]}]
My desired output is to count the URLs of each language and append it to its corresponding language
Advertisement
Answer
Some changes:
- reduce urls to an object because it’s faster to lookup entries than array.find and generally less complex.
- take the object and generate an array with language, url list for that language, and count (which is just url list length).
const urls = [ {language: "java", url: "url1"}, {language: "java", url: "url2"}, {language: "php", url: "url3"}, {language: "javascript", url:"url4"}, {language: "php", url: "url5"}, {language: "java", url: "url6"} ]; result = Object.entries( urls.reduce((r, { language, url }) => { if (!r[language]) r[language] = []; r[language].push(url); return r; }, {}) ).map(([language, urls]) => ( {language, urls, count: urls.length} )); console.log(result);