0
votes

Comment faire en sorte que mon code trie les données récupérées sous forme de texte JSON à partir de Reddit?

[Trier le tableau d'objets par valeur de propriété]

Je veux comparer le nombre de votes positifs et trier, mais j'ai un problème pour comprendre comment accéder à l'objet "ups" depuis mon api. J'ai créé la fonction de comparaison et je veux l'appeler. Je l'appelle probablement sur le mauvais objet.

 function fetchData(url) {
    return fetch(url).then((resp) => resp.json());
}

function createTableRow(data) {
    const tableRow = document.createElement('tr');
    const {
        title,
        ups,
        downs,
        score,
        num_comments,
        created
    } = data;
    console.log(ups);
    tableRow.appendChild(createElement('td', title))
    tableRow.appendChild(createElement('td', ups))
    tableRow.appendChild(createElement('td', downs))
    tableRow.appendChild(createElement('td', score))
    tableRow.appendChild(createElement('td', num_comments))
    tableRow.appendChild(createElement('td', created))
    return tableRow;
}


function createElement(tag_name, text) {
    const el = document.createElement(tag_name);
    const content = document.createTextNode(text);
    el.appendChild(content);
    return el;
}

**function compare(a,b) {
    if(a.ups<b.ups) {
        return -1;
    }
    if(a.ups>b.ups){
        return 1;
    }
    return 0;
}** 


const butt = document.getElementById('button');

const swTable = document.getElementById('sw_table').getElementsByTagName('tbody')[0];


fetchData('https://www.reddit.com/r/funny.json')
.then(data => {
    data.data.children.forEach(result => {
    const table = createTableRow(result.data);
    swTable.appendChild(table);
   // butt.onclick(sortData(ups));
   **data.data.children.ups.sort(compare);**
});
});

Erreur: Uncaught (in promise) TypeError: Impossible de lire la propriété 'sort' de undefined


5 commentaires

À quoi ressemblent vos données?


@ U25lYWt5IEJhc3RhcmQg J'ai d'abord pensé que j'aurais besoin de relier cela encore une fois, mais cela semble être différent. OP ne demande pas comment le faire mais pourquoi cela ne fonctionne pas une fois terminé.


@VLAZ: Je ne pense pas vraiment que ce soit différent, la toute première réponse semble fournir ce qui est nécessaire


@ U25lYWt5IEJhc3RhcmQg cette question concerne une erreur alors que OP a déjà un tri par propriété. Il ne s'agit pas de "comment trier par propriété". Il est très probable qu'OP ait déjà vu l'autre question et essayé de la mettre en œuvre, mais a maintenant rencontré un problème de tri. Leur indiquer "comment le faire" n'aiderait pas nécessairement.


Copie possible de Tri d'un tableau d'objets JavaScript par propriété


3 Réponses :


1
votes

Voici ce que vous devez utiliser:

fetchData('https://www.reddit.com/r/funny.json')
  .then(data => {
    const sortedResults = data.data.children.sort((a,b) => b.data.ups - a.data.ups)
    sortedResults.forEach(result => {
      const row = createTableRow(result.data);
      swTable.appendChild(row);
    })
  });
});
  • Vous devez trier directement sur les résultats
  • a.data.ups - b.data.ups renverra soit un nombre négatif si a a plus de ups que b , a nombre positif si b a plus de ups que a , et 0 s'ils ont le même montant d'ups


0 commentaires

0
votes

Si l'on considère que l'API renvoie les données au format:

 .then(data => {
    data.data.children.sort(compare)
      .forEach(result => {
         const table = createTableRow(result);
         swTable.appendChild(table);
      })
});

La modification de la fonction puis comme ci-dessous résoudra votre problème. p >

{
   "data": {
       children: [
          {
             title,
             ups,
             downs,
             score,
             num_comments,
             created
          }
       ]

   }
}


0 commentaires

0
votes

Remplacez la ligne ci-dessous,

data.data.children.sort((a,b)=>a.ups-b.ups); // ascending

data.data.children.sort((a,b)=>b.ups-a.ups); // descending

par

**data.data.children.ups.sort(compare);**


0 commentaires