mihoci10
mihoci10

Reputation: 449

How to sort steam market JSON data

I am trying to query data from the steam marketplace in JSON form.

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

This is what I got so far for the query: JSON-Data

However this query can only return 100 items per query and if not sorted they are always randomly unordered. I want to get all data by stiching together 100 batches of data at a time. But in order for that to work I need to be able to sort the data.

Basically I am missing a GET argument to pass through with the URL to get the data sorted.

Thanks for any help in advance!

Upvotes: 2

Views: 1686

Answers (4)

jkmartindale
jkmartindale

Reputation: 557

You're looking for two GET variables:

sort_column can be set to default, name, price, and quantity (and maybe others, I don't know).

sort_dir can be set to asc or desc.

I'm not sure what field you're trying to sort your search results by but hopefully this helps.

Upvotes: 3

bdbdbd
bdbdbd

Reputation: 503

Well to get the full data from the API you can use a generator function to make requests until you reach the end:

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);
    }       
}

This calls the API with &start=0 the first time, and increments it by pagesize until start is bigger than the total number of results.

For sorting them, here's a way of sorting the results by key (for example by name):

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);
};

This returns a function that you can pass into Array.sort() as a parameter. Note that you can change 'asc' to 'desc' for ascending or descending respectively.

Now to piece this together, you call the generator function and push the results to an array until all data has come in. Then you .sort(compareValues('property e.g. name')) it to see your sorted results:

(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')));
})();

Let me know if it worked :)

Upvotes: 0

Nick
Nick

Reputation: 147216

This function will sort by sell_price ascending (for the snippet I cut most of the fields out of the JSON). If you want to sort by sell_price descending, change a.sell_price - b.sell_price to 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)

Upvotes: 1

Jean Souza
Jean Souza

Reputation: 31

Follow a example to sort your JSON-Data by price (descending):

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;
});

Upvotes: 1

Related Questions