Javascript 通过动态(更改)数组大小的JSON字符串进行跟踪

Javascript 通过动态(更改)数组大小的JSON字符串进行跟踪,javascript,jquery,json,Javascript,Jquery,Json,我试图在JSON数组中导航,其中一些对象的大小可能会有所不同。JSON代码段太大,无法发布,因此我将其发布在JSON Blob上,,并尝试遍历此结构,获取其属性中具有最高值的对象 在下图中,我试图抓取在“TotalSessionPlayed”中数量最多的“champion”对象 我的问题是找出如何循环,然后捕获总会话值,然后比较它们,最终检索总会话数最高的冠军对象。我习惯于对值/路径进行硬编码,因为它总是静态地设置大小,而在这里大小可以改变 我相信我需要做以下几点……但我不能完全确定 json

我试图在JSON数组中导航,其中一些对象的大小可能会有所不同。JSON代码段太大,无法发布,因此我将其发布在JSON Blob上,,并尝试遍历此结构,获取其属性中具有最高值的对象

在下图中,我试图抓取在“TotalSessionPlayed”中数量最多的“champion”对象

我的问题是找出如何循环,然后捕获总会话值,然后比较它们,最终检索总会话数最高的冠军对象。我习惯于对值/路径进行硬编码,因为它总是静态地设置大小,而在这里大小可以改变

我相信我需要做以下几点……但我不能完全确定

json = JSON && JSON.parse(response) || $.parseJSON(response);

         $.each(json, function (i, el) {
                if (el.stats.totalSessionsPlayed > highestSession)
                {
                   highestSession = el.stats.totalSessionsPlayed...?
                }
          });
     //when done, somehow get the champion object that relates to that highestSession value.
我对JSON还是新手,只是在遍历这个动态大小的JSON时迷失了方向

  • 创建阵列以容纳顶级冠军(如果是平局,则可能是多个)
  • 循环通过冠军阵列
  • 使用
    获得
    totalSessionPlayed
    值最高的冠军;并使用
    ==
    确定是否已经有另一位冠军拥有相同的最高分数
  • 如果是平局,则将当前冠军添加到阵列中,否则使用新冠军创建新阵列
  • 解决方案代码:

    var highestSession = -1; // set it low initially
    var topChamps = []; // array since could be a N-way tie
    $.each(json.champions, function(idx, champion) {
      if (champion.id > 0 && champion.stats) {
        if (champion.stats.totalSessionsPlayed > highestSession) {
          // new top score broke any possible ties
          topChamps = [champion]; // new array
          highestSession = champion.stats.totalSessionsPlayed; // save new max value
        } else if (champion.stats.totalSessionsPlayed === highestSession) {
          // it's a tie, add to list
          topChamps[topChamps.length] = champion;
        }
      }
    });
    
    针对OP的实际JSON数据运行此示例代码段:

    //伪json仅供示例
    var json={
    “召唤号”:22421317,
    “修改日期”:1414692614000,
    “冠军”:[{
    “id”:110,
    “统计数据”:{
    “TotalSessionPlayed”:5,
    “totalSessionsLost”:5,
    “totalSessionsWon”:0,
    “totalChampionKills”:32,
    “总损失处理”:725106,
    “总损失”:113405,
    “mostChampionKillsPerSession”:13,
    “totalMinionKills”:937,
    “totalDoubleKills”:3,
    “totalTripleKills”:0,
    “totalQuadraKills”:0,
    “totalPentaKills”:0,
    “totalUnrealKills”:0,
    “死亡总人数”:52,
    “总收入”:62141,
    “mostSpellsCast”:0,
    "全日制":6,,
    “处理的总物理损伤”:613669,
    “TotalMagicDamageDealed”:105253,
    “totalFirstBlood”:0,
    “总协助”:55,
    “maxChampionsKilled”:13,
    “最大死亡数”:14
    }
    }, {
    “id”:21,
    “统计数据”:{
    “TotalSessionPlayed”:7,
    “totalSessionsLost”:1,
    “totalSessionsWon”:6,
    “totalChampionKills”:54,
    “总损失处理”:1143509,
    “总损失”:132528,
    “mostChampionKillsPerSession”:18,
    “totalMinionKills”:1420,
    “totalDoubleKills”:7,
    “totalTripleKills”:1,
    “totalQuadraKills”:0,
    “totalPentaKills”:0,
    “totalUnrealKills”:0,
    “死亡总人数”:56,
    “Totalgoldworned”:99924,
    “mostSpellsCast”:0,
    “总数”:24,
    “总物理损伤处理”:973400,
    “TotalMagicDamageDealed”:159071,
    “totalFirstBlood”:0,
    “总助攻”:67,
    “maxChampionsKilled”:18岁,
    “最大死亡数”:11
    }
    }, {
    “id”:19,
    “统计数据”:{
    “TotalSessionPlayed”:18,
    “totalSessionsLost”:9,
    “totalSessionsWon”:9,
    “totalChampionKills”:94,
    “TotalDamageDealed”:1864380,
    “TotalDamageTake”:764921,
    “mostChampionKillsPerSession”:12,
    “totalMinionKills”:923,
    “totalDoubleKills”:3,
    “totalTripleKills”:0,
    “totalQuadraKills”:0,
    “totalPentaKills”:0,
    “totalUnrealKills”:0,
    “死亡总人数”:154,
    “总收入”:212650,
    “mostSpellsCast”:0,
    “总计”:14,
    “处理的总物理损伤”:932921,
    “TotalMagicDamageDealed”:565418,
    “totalFirstBlood”:0,
    “总协助”:241,
    “maxChampionsKilled”:12,
    “最大死亡数”:12
    }
    }, {
    “id”:89,
    “统计数据”:{
    “TotalSessionPlayed”:41,
    “totalSessionsLost”:15,
    “totalSessionsWon”:26,
    “totalChampionKills”:162,
    “总损失处理”:1655899,
    “总损失”:1322562,
    “mostChampionKillsPerSession”:12,
    “总仆从杀手”:1684,
    “totalDoubleKills”:6,
    “totalTripleKills”:1,
    “totalQuadraKills”:0,
    “totalPentaKills”:0,
    “totalUnrealKills”:0,
    “死亡总人数”:318,
    “Totalgoldrend”:447598,
    “mostSpellsCast”:0,
    “总数”:16,
    “总物理损伤处理”:434852,
    “TotalMagicDamageDealed”:1042032,
    “totalFirstBlood”:0,
    “总计协助”:716,
    “maxChampionsKilled”:12,
    “最大死亡数”:14
    }
    }, {
    “id”:9,
    “统计数据”:{
    “TotalSessionPlayed”:1,
    “totalSessionsLost”:1,
    “totalSessionsWon”:0,
    “totalChampionKills”:14,
    “总损失处理”:269323,
    “总损失”:43294,
    “mostChampionKillsPerSession”:14,
    “总仆从杀手”:91,
    “totalDoubleKills”:2,
    “totalTripleKills”:0,
    “totalQuadraKills”:0,
    “totalPentaKills”:0,
    “totalUnrealKills”:0,
    “死亡总动员”:6,
    “Totalgoldworned”:18899,
    “mostSpellsCast”:0,
    "总体":1,,
    “已处理的总体物理损伤”:17923,
    “TotalMagicDamageDealed”:236252,
    “totalFirstBlood”:0,
    “总助攻”:18,
    “maxChampionsKilled”:14,
    “最大死亡数”:6
    }
    }, {
    “id”:10,
    “统计数据”:{
    “TotalSessionPlayed”:2,
    “totalSessionsLost”:1,
    “totalSessionsWon”:1,
    “totalChampionKills”:14,
    “总损失处理”:229398,
    “总损失”:50962,
    “mostChampionKillsPerSession”:13,
    “总仆从杀手”:250,
    “totalDoubleKills”:2,
    “totalTripleKills”:0,
    “totalQuadraKills”:0,
    “totalPentaKills”:0,
    “totalUnrealKills”:0,
    “死亡总人数”:16,
    “总收入”:22793,
    
    var bestChamp = json.champions.reduce(function (prev, next) {
        if (prev.stats.totalSessionsPlayed >= next.stats.totalSessionsPlayed) {
            return prev;
        } else {
            return next;
        }
    });
    
    // bestChamp contains the object
    
    var bestChamp = json.champions.reduce(function (prev, next) {
        if (next.id === 0) {
            return prev;
        }
    
        if (prev.stats.totalSessionsPlayed >= next.stats.totalSessionsPlayed) {
            return prev;
        } else {
            return next;
        }
    });
    
    // bestChamp contains the object
    
    json.champions.reduce(function(current, champ) {
        return champ.stats.totalSessionsPlayed > current.stats.totalSessionsPlayed
                ? champ : current;
    });