2
votes

Comment trier les données JSON du marché Steam

J'essaie d'interroger les données du marché Steam sous forme JSON.

{"success":true,"start":0,"pagesize":10,"total_count":7058,"searchdata":{"query":"strange","search_descriptions":true,"total_count":7058,"pagesize":10,"prefix":"searchResults","class_prefix":"market"},"results":[{"name":"Strange Sandman","hash_name":"Strange Sandman","sell_listings":142,"sell_price":16,"sell_price_text":"$0.16","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1336074288","instanceid":"11043061","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUxAeUh_ntgdBidzZAfOeD-VOz9s0vMAM3WRtwwcsNuGwZzJjc1SVUKQJDq1u91zvW3Uw7sQ7ANPm8fUWJ1sZuDp64A","tradable":1,"name":"Strange Sandman","name_color":"CF6A32","type":"Strange Bat - Kills: 13","market_name":"Strange Sandman","market_hash_name":"Strange Sandman"},"sale_price_text":"$0.15"},{"name":"Strange Bonesaw","hash_name":"Strange Bonesaw","sell_listings":166,"sell_price":18,"sell_price_text":"$0.18","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1336077034","instanceid":"3500303792","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwUeUx7xuS98hMn0CvfCCeUGmt5jtMcAjmY8xwctZrXtMjIzdlWXAPRfD6Fj8A7pXnYw6ZM7VZmm-by4sbbgvA","tradable":1,"name":"Strange Bonesaw","name_color":"CF6A32","type":"Strange Bonesaw - Kills: 5","market_name":"Strange Bonesaw","market_hash_name":"Strange Bonesaw"},"sale_price_text":"$0.17"},{"name":"Strange Equalizer","hash_name":"Strange Equalizer","sell_listings":192,"sell_price":14,"sell_price_text":"$0.14","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1336076973","instanceid":"11041085","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUxcYXhDjoD18m5rZAfOeD-VOwow245UHiGRtlVd4Y-K3Mm4yKwGXB_YNC_dpoAzuWSNn7p4wA9K3oPUWJ1sEtEon8w","tradable":1,"name":"Strange Equalizer","name_color":"CF6A32","type":"Strange Pickaxe - Kills: 2","market_name":"Strange Equalizer","market_hash_name":"Strange Equalizer"},"sale_price_text":"$0.13"},{"name":"Strange Shortstop","hash_name":"Strange Shortstop","sell_listings":137,"sell_price":24,"sell_price_text":"$0.24","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1336074068","instanceid":"11044703","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUxQZUgn2qyxMmPfqDOCLDa4CyY1jtsMC2mIyyVgjZOW0ZTQzJACSV6VdWq1qpAy_WnNmuJIyUY_muasILkyCzE-6","tradable":1,"name":"Strange Shortstop","name_color":"CF6A32","type":"Strange Peppergun - Kills: 61","market_name":"Strange Shortstop","market_hash_name":"Strange Shortstop"},"sale_price_text":"$0.23"},{"name":"Strange Bushwacka","hash_name":"Strange Bushwacka","sell_listings":122,"sell_price":43,"sell_price_text":"$0.43","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1336074187","instanceid":"11041089","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwQDUhjdszZKjs3ZAfOeD-VOmII0ssVW2jQ4k1h-Nra3aGVmdlbHA6VfDKFj8V_tX3RmsJY7BoXgp_UWJ1t8YRvBDw","tradable":1,"name":"Strange Bushwacka","name_color":"CF6A32","type":"Strange Kukri - Kills: 65","market_name":"Strange Bushwacka","market_hash_name":"Strange Bushwacka"},"sale_price_text":"$0.42"},{"name":"Strange Degreaser","hash_name":"Strange Degreaser","sell_listings":181,"sell_price":47,"sell_price_text":"$0.47","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1336078768","instanceid":"3507092741","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwMUWgnnuStGmvfqDOCLDa5SzI9ms8RWgDU4wgUsN7HgMjUzdgGRU_FdDvFs8ly_CHc0vcM7DI_juasILvdwG6rd","tradable":1,"name":"Strange Degreaser","name_color":"CF6A32","type":"Strange Flame Thrower - Kills: 0","market_name":"Strange Degreaser","market_hash_name":"Strange Degreaser"},"sale_price_text":"$0.45"},{"name":"Strange Knife","hash_name":"Strange Knife","sell_listings":186,"sell_price":50,"sell_price_text":"$0.50","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1337324707","instanceid":"3508461538","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEcUwwfVB3nhzRCms_jQ6DeCuFZmtwwsJQHi2A9lVJ_beKzYDEwdgfEWPlaCqI-oVC0CiVqsZItRNmxr5xPBI8","tradable":1,"name":"Strange Knife","name_color":"CF6A32","type":"Strange Knife - Kills: 0","market_name":"Strange Knife","market_hash_name":"Strange Knife"},"sale_price_text":"$0.48"},{"name":"Strange Scarecrow","hash_name":"Strange Scarecrow","sell_listings":9,"sell_price":199,"sell_price_text":"$1.99","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1849008471","instanceid":"510479732","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEYfB4uThjjqj1AmsfxC_OPDd8Mmsgy4N4H2GM_kFh4ZOG3aDIycAeSWPcKD6c78Q3tXSJhupM6B4_j9uIFfAvuqsKYZPpZeK5I","tradable":1,"name":"Strange Scarecrow","name_color":"CF6A32","type":"Strange Hat - Points Scored: 0","market_name":"Strange Scarecrow","market_hash_name":"Strange Scarecrow"},"sale_price_text":"$1.91"},{"name":"Strange Amputator","hash_name":"Strange Amputator","sell_listings":111,"sell_price":37,"sell_price_text":"$0.37","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1336074107","instanceid":"11040852","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwYcTQ72uSxMmvfqDOCLDa4CzIwzsMYAj2cykgJ6MLq2YDM2IALDU_MGWPFop1u0WnJrsJIxDIPhuasILuZAMKd1","tradable":1,"name":"Strange Amputator","name_color":"CF6A32","type":"Strange Bonesaw - Kills: 0","market_name":"Strange Amputator","market_hash_name":"Strange Amputator"},"sale_price_text":"$0.36"},{"name":"Strange Vaccinator","hash_name":"Strange Vaccinator","sell_listings":80,"sell_price":84,"sell_price_text":"$0.84","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1336074202","instanceid":"4306533","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwoUWRLlrTZ8jM3gCPyfDd8Mmsgy4N4HizAyxFQuMeDmaTEwc1SUWPkNBKI_8lG_C38zvp83AIDloesDcFjuqsKYZD2aO7gJ","tradable":1,"name":"Strange Vaccinator","name_color":"CF6A32","type":"Strange Vaccinator - Ubers: 35","market_name":"Strange Vaccinator","market_hash_name":"Strange Vaccinator"},"sale_price_text":"$0.81"}]}

Voici ce que j'ai obtenu jusqu'à présent pour la requête: JSON-Data

Cependant, cette requête peut ne renvoie que 100 éléments par requête et s'ils ne sont pas triés, ils ne sont toujours pas classés au hasard. Je veux obtenir toutes les données en assemblant 100 lots de données à la fois. Mais pour que cela fonctionne, je dois être en mesure de trier les données.

En gros, il me manque un argument GET pour passer avec l'URL pour que les données soient triées.

Merci pour toute aide à l'avance!


1 commentaires

Je pense que votre question est vraiment "comment obtenir le prochain lot de données triées à partir de l'API", ce qui est vraiment hors de portée ici - consultez la documentation de l'API de ce site


4 Réponses :


1
votes

Suivez un exemple pour trier vos données JSON par prix (décroissant):

var sorted = jsonData.results.sort(function(productA, productB) {
     if (productA.sell_price > productB.sell_price) {
        return -1;
    }
    if (productB.sell_price > productA.sell_price) {
        return 1;
    }
    return 0;
});


1 commentaires

Merci pour la réponse. Oui, cela fonctionnerait si je pouvais interroger toutes les données à la fois. Mais je ne peux pas faire cela (il est limité à 100 à la fois). Vous pouvez modifier l'élément de départ en requête afin que je puisse charger des données de 100 lots à la fois sans problème. Seul problème pour cela pour obtenir tous les éléments dont j'ai besoin pour obtenir le tri des données.



1
votes

Cette fonction triera par sell_price croissant (pour l'extrait de code, j'ai supprimé la plupart des champs du JSON). Si vous souhaitez trier par prix_vente décroissant, remplacez a.sell_price - b.sell_price par b.sell_price - a.sell_price :

const json = '{"success": true,"start": 0,"pagesize": 10,"total_count": 7046,"searchdata": {"query": "strange","search_descriptions": true,"total_count": 7046,"pagesize": 10,"prefix": "searchResults","class_prefix": "market"},"results": [{"name": "Strange Enforcer","hash_name": "Strange Enforcer","sell_listings": 176,"sell_price": 18,"sell_price_text": "$0.18"},{"name": "Strange Ambassador","hash_name": "Strange Ambassador","sell_listings": 221,"sell_price": 32,"sell_price_text": "$0.32"},{"name": "Strange Equalizer","hash_name": "Strange Equalizer","sell_listings": 191,"sell_price": 15,"sell_price_text": "$0.15"},{"name": "Strange Balloonicorn","hash_name": "Strange Balloonicorn","sell_listings": 35,"sell_price": 250,"sell_price_text": "$2.50"},{"name": "Strange Powerjack","hash_name": "Strange Powerjack","sell_listings": 149,"sell_price": 17,"sell_price_text": "$0.17"},{"name": "Strange Warhood","hash_name": "Strange Warhood","sell_listings": 56,"sell_price": 55,"sell_price_text": "$0.55"},{"name": "Strange Classic","hash_name": "Strange Classic","sell_listings": 119,"sell_price": 65,"sell_price_text": "$0.65"},{"name": "Strange Rainblower","hash_name": "Strange Rainblower","sell_listings": 187,"sell_price": 42,"sell_price_text": "$0.42"},{"name": "Strange Shotgun","hash_name": "Strange Shotgun","sell_listings": 124,"sell_price": 111,"sell_price_text": "$1.11"},{"name": "Strange Phlogistinator","hash_name": "Strange Phlogistinator","sell_listings": 153,"sell_price": 63,"sell_price_text": "$0.63"}]}';
let data = JSON.parse(json);
data.results.sort((a, b) => a.sell_price - b.sell_price);
console.log(data)


5 commentaires

Merci pour la réponse mais mon problème est toujours le même que l'autre réponse.


@ mihoci10 vous ne l'avez pas mentionné dans votre question initiale. Vous devrez créer une boucle pour récupérer chaque 100 valeurs et utiliser concat pour joindre les résultats de chaque extraction au tableau de résultats global; alors vous pouvez utiliser ce code pour trier.


Vous avez raison, je suis désolé. J'ai édité ma question pour élaborer un peu plus sur la question.


Pouvez-vous montrer votre code existant qui facilitera la formulation d'une réponse?


Il n'y a pas encore de code fonctionnel, je demande seulement si quelqu'un sait quel paramètre GET je dois utiliser pour obtenir des données triées.



0
votes

Eh bien, pour obtenir les données complètes de l'API, vous pouvez utiliser une fonction de générateur pour faire des requêtes jusqu'à la fin:

(async () => {
    const results = [];
    for await (const item of items('https://steamcommunity.com/market/search/render/?query=strange&search_descriptions=1&norender=1&appid=440&currency=3&language=english&format=json'))
    results.push(item);
    console.log(results.sort(compareValues('name')));
})();

Cela appelle l'API avec & start = 0 la première fois, et l'incrémente de la taille de la page jusqu'à ce que start soit plus grand que le nombre total de résultats.

Pour les trier, voici un moyen de trier les résultats par clé (par exemple par nom):

const compareValues = (key, order = 'asc') => function (a, b) {
    if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key))
        return 0;
    const varA = typeof a[key] === 'string' ?
        a[key].toUpperCase() : a[key];
    const varB = typeof b[key] === 'string' ?
        b[key].toUpperCase() : b[key];

    let comparison = 0;
    if (varA > varB)
        comparison = 1;
    else if (varA < varB)
        comparison = -1;

    return (order === 'desc' ? comparison * -1 : comparison);
};

Ceci renvoie une fonction que vous pouvez passer dans Array.sort () en tant que paramètre. Notez que vous pouvez changer «asc» en «desc» pour respectivement croissant ou décroissant.

Maintenant, pour rassembler cela, vous appelez la fonction de générateur et poussez les résultats dans un tableau jusqu'à ce que toutes les données soient entrées. Ensuite, vous .sortez (compareValues ​​('property eg name')) pour voir vos résultats triés:

const axios = require('axios');
async function* items(url, start = 0) {
    const res = await axios(url + '&start=' + start);
    yield* res.data.results;
    if (start < res.data.total_count) {
        start += res.data.pagesize;
        yield* items(url, start);
    }       
}

Faites-moi savoir si cela a fonctionné :)

p>


0 commentaires

3
votes

Vous recherchez deux variables GET:

sort_column peut être défini sur default , name , price et quantité (et peut-être d'autres, je ne sais pas).

sort_dir peut être défini sur asc ou desc .

Je ne sais pas dans quel champ vous essayez de trier vos résultats de recherche, mais j'espère que cela vous aidera.


0 commentaires