【问题标题】:How to sort steam market JSON data如何对 Steam 市场 JSON 数据进行排序
【发布时间】:2019-09-05 06:14:19
【问题描述】:

我正在尝试以 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"}]}

这是我目前得到的查询:JSON-Data

但是,此查询每个查询只能返回 100 个项目,如果未排序,它们始终是随机无序的。我想通过一次将 100 批数据拼接在一起来获取所有数据。但为了让它工作,我需要能够对数据进行排序。

基本上我缺少一个 GET 参数来传递 URL 以对数据进行排序。

提前感谢您的帮助!

【问题讨论】:

  • 我认为您的问题实际上是“如何从 API 中排序下一批数据”,这实际上超出了这里的范围 - 请参阅该站点 API 文档

标签: javascript json steam steam-web-api


【解决方案1】:

您正在寻找两个 GET 变量:

sort_column 可以设置为defaultnamepricequantity(也许还有其他,我不知道)。

sort_dir 可以设置为ascdesc

我不确定您尝试按哪个字段对搜索结果进行排序,但希望这会有所帮助。

【讨论】:

    【解决方案2】:

    按照示例按价格(降序)对 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;
    });
    

    【讨论】:

    • 感谢您的回复。是的,如果我可以一次查询所有数据,这将起作用。但是我不能这样做(一次限制为100个)您可以更改起始项以查询,这样我一次可以加载100个批次的数据没问题。唯一的问题是获取我需要对数据进行排序的所有项目。
    【解决方案3】:

    此函数将按sell_price 升序排序(对于 sn-p,我从 JSON 中删除了大部分字段)。如果要按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)

    【讨论】:

    • 感谢您的回复,但我的问题仍然与其他答案相同。
    • @mihoci10 您在原始问题中没有提到这一点。您需要创建一个循环来获取每 100 个值并使用 concat 将每次获取的结果加入到整个结果数组中;那么就可以使用这段代码进行排序了。
    • 你说得对,对不起。我编辑了我的问题以详细说明这个问题。
    • 您能否展示您现有的代码,以便更轻松地制定答案?
    • 目前还没有功能代码,我只是问是否有人知道我应该使用什么 GET 参数来获取排序数据。
    【解决方案4】:

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

    这第一次使用 &start=0 调用 API,并按 pagesize 递增,直到 start 大于结果总数。

    为了对它们进行排序,这里有一种按键(例如按名称)对结果进行排序的方法:

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

    这将返回一个函数,您可以将该函数作为参数传递给 Array.sort()。请注意,您可以将 'asc' 更改为 'desc' 分别用于升序或降序。

    现在把它拼凑起来,你调用生成器函数并将结果推送到一个数组,直到所有数据都进来。然后你 .sort(compareValues('property e.g. 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')));
    })();
    

    让我知道它是否有效:)

    【讨论】:

      猜你喜欢
      • 2016-03-12
      • 2020-09-15
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 2014-10-17
      • 2015-08-18
      • 2016-02-21
      • 2021-04-23
      相关资源
      最近更新 更多