Saya menggunakan kode ini untuk mengambil 100 repo publik yang sedang tren di GitHub.

Untuk setiap bahasa, saya menghitung Daftar repo menggunakan bahasa tersebut, tetapi saya tidak dapat menghitung jumlah repo menggunakan bahasa ini

Bagian dari kode saya

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;
    }, []);

Ini adalah contoh hasil saya

[{
"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"
]}]

Hasil yang saya inginkan adalah menghitung URL dari setiap bahasa dan menambahkannya ke bahasa yang sesuai

0
Mohamed Khalifa 12 Mei 2021, 18:18

4 jawaban

Jawaban Terbaik

Beberapa perubahan:

  • kurangi url ke objek karena lebih cepat untuk mencari entri daripada array.find dan umumnya tidak terlalu rumit.
  • ambil objek dan buat array dengan bahasa, daftar url untuk bahasa itu, dan hitung (yang hanya panjang daftar url).
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);
1
James 12 Mei 2021, 15:43

Lakukan saja

let output = Object.entries( data.items.reduce((res,{url,language})=>
  {
  res[language] = res[language] ?? []
  res[language].push(url)
  return res
  },{})
).map(([k,v])=>({[k]:v, count: v.length}))
0
Mister Jojo 12 Mei 2021, 16:06

Ini adalah bagaimana Anda dapat melakukannya dengan map:

    console.log([{
    "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"
    ]}].map((item) => {return {[Object.keys(item)[0]]: item[Object.keys(item)[0]].length}}));
0
Lajos Arpad 12 Mei 2021, 15:45

Pendekatan paling sederhana adalah mengubah tipe acc Anda dari [] menjadi {} yang dapat membawa properti count:

const urls = [{
  language: "Javascript",
  url: "url1"
}, {
  language: "Python",
  url: "url2"
}, {
  language: "Javascript",
  url: "url3"
}]

const result = urls.reduce((r, {
  language,
  url
}) => {
  if (r[language]) {
    r[language].urls.push(url)
    r[language].count ++

  } else {
    r[language] = { urls: [url], count : 1 }
  }
  
  return r;
}, {});

console.log(result)

Atau, untuk menghindari pengulangan 3 kali pada larik items, Anda dapat melakukan semua operasi Anda dari map et filter dalam pengurangan

0
Pierre_T 12 Mei 2021, 15:34