简体   繁体   English

如何对 Steam 市场 JSON 数据进行排序

[英]How to sort steam market JSON data

I am trying to query data from the steam marketplace in JSON form.我正在尝试以 JSON 形式从 Steam 市场查询数据。

{"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这是我到目前为止查询的结果: JSON-Data

However this query can only return 100 items per query and if not sorted they are always randomly unordered.然而,这个查询每个查询只能返回 100 个项目,如果没有排序,它们总是随机无序的。 I want to get all data by stiching together 100 batches of data at a time.我想通过一次将 100 批数据拼接在一起来获取所有数据。 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.基本上,我缺少一个 GET 参数来传递 URL 以对数据进行排序。

Thanks for any help in advance!提前感谢您的任何帮助!

You're looking for two GET variables:您正在寻找两个 GET 变量:

sort_column can be set to default , name , price , and quantity (and maybe others, I don't know). sort_column可以设置为defaultnamepricequantity (也许还有其他的,我不知道)。

sort_dir can be set to asc or desc . sort_dir可以设置为ascdesc

I'm not sure what field you're trying to sort your search results by but hopefully this helps.我不确定您尝试按哪个字段对搜索结果进行排序,但希望这会有所帮助。

Follow a example to sort your JSON-Data by price (descending):按照示例按价格(降序)对 JSON 数据进行排序:

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

This function will sort by sell_price ascending (for the snippet I cut most of the fields out of the JSON).此函数将按sell_price升序排序(对于我从 JSON 中删除大部分字段的代码段)。 If you want to sort by sell_price descending, change a.sell_price - b.sell_price to b.sell_price - a.sell_price :如果您想按sell_price降序排序, sell_price a.sell_price - b.sell_price更改为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)

Well to get the full data from the API you can use a generator function to make requests until you reach the end:好吧,要从 API 获取完整数据,您可以使用生成器函数发出请求,直到到达终点:

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.这第一次使用 &start=0 调用 API,并按 pagesize 递增它,直到 start 大于结果总数。

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.这将返回一个函数,您可以将其作为参数传递给 Array.sort()。 Note that you can change 'asc' to 'desc' for ascending or descending respectively.请注意,您可以将 'asc' 更改为 'desc' 分别用于升序或降序。

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 eg name')) it to see your sorted results:现在把它们拼凑起来,你调用生成器函数并将结果推送到一个数组,直到所有数据都进入。然后你 .sort(compareValues('property eg name')) 它来查看你的排序结果:

(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 :)让我知道它是否有效:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM