[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
3 Réponses :
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);
})
});
});
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 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
}
]
}
}
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);**
À 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é