2016-02-02 3 views
0

Для высокопроизводительных диаграмм мне нужно генерировать данные синтаксического анализа для генерации серий. данные из API выглядит следующим образом:Проведите анализ массива в js

[ date : XX, 
    series : [ 
      player_id : 1, 
      team_id : 1, 
      score : 4 ], 
      [ 
      player_id : 2, 
      team_id : 4, 
      score : 1 ], 
      [ 
      player_id : 4, 
      team_id : 1, 
      score : 4 ] 

], 
[ date : XX+1 
    series : ... 
], 
... 

Во-первых, пользователь должен выбрать команду и игроков, но иногда нет никакого результата. Например, для даты XX я выбрал 4 идентификатора команды, но API возвращает только 2 из них. Я должен принять это во внимание. Я пытаюсь использовать разные типы сериалов, первый представляет все результаты команды, второй - всех игроков, а другой - для каждой команды. Таким образом, существует много графиков.

Я использую Ampserand.js, модель такая же, но он называется столько же времени, сколько количество команд, выбранных в форме.

я сделал что-то вроде этого:

function parse(data) { 
    var series = []; 
    var dates = []; 
    var findIndexByValue = function(arraytosearch, key, valuetosearch) { 
     for (var i = 0; i < arraytosearch.length; i++) { 
      if (arraytosearch[i][key] == valuetosearch) { 
       return i; 
      } 
     } 
     return null; 
    } 

    for (var i = 0; i < data.length; i++) { 
     var dTemp = new Date(data[i].date).getTime(); 

     // Keep dates in case of empty values 
     dates.push(dTemp); 

     for (var s = 0; s < data[i].series.length; s++) { 
      var current = data[i].series[s]; 

      if (this.currentype === "allTeamSeries") { 
       var currentIndex = findIndexByValue(series, "team", current.team_id); 

       if (currentIndex === null) { 
        series.push({ 
         team: current.team_id, 
         data: [dTemp, current.avg] 
        }); 
       } else { 
        series[currentIndex].data.push([dTemp, current.score]); 
       } 
      } else if (this.currentResource === "playerseries") { 
       var currentIndex = findIndexByValue(series, "player", current.player_id); 

       if (currentIndex === null) { 
        series.push({ 
         player: current.player_id, 
         data: [dTemp, current.score] 
        }); 

       } else { 
        series[currentIndex].data.push([dTemp, current.score]); 
       } 
      } else { //currentTeam from model 
       if (this.currentTeam === current.team_id) { 
        var currentIndex = findIndexByValue(series, "site", current.site_id); 

        if (currentIndex === null) { 
         series.push({ 
          team: current.team_id, 
          data: [dTemp, current.score] 
         }); 
        } else { 
         series[currentIndex].data.push([dTemp, current.score]); 
        } 
       } 
      } 
     } 
    } 


    // Avoid empty charts 
    if (series.length === 0) { 
     series.push({ 
      team: this.currentTeam, 
      data: [] 
     }); 

     dates.forEach(function(elem) { 
      series[0].data.push([elem, 0]); 
     }); 
    } 

    return { 
     startdate: this.config.startdate, 
     enddate: this.config.enddate, 
     series: series 
    }; 
} 

У меня есть проблема с серией генерируемой, когда нет никакого результата для команды в результате этого API.

пригодный для использования массива должен быть, как это, например:

series: [{ 
    name: 'Team 1', 
    data: [4163, 5203, 6276, 5408, 3547, 3729, 3828,4163, 5203, 6276, 5408, 3547, 3729, 3828,4163, 5203, 6276, 5408, 3547, 3729, 3828] 
    }, 
    { 
    name: 'Team 2', 
    data: [...] 
}] 

Кроме того, код выглядит излишним, есть трюк с некоторой функцией массива, чтобы сделать это легко?

Заранее спасибо, большая проблема для меня здесь!

ответ

0

Ваш код работает для вас? Я просто попробовал это: http://jsfiddle.net/ma50685a/5/ - выглядит странно.

Во всяком случае, я хотел бы предложить, чтобы улучшить чуток ваши if-else заявления, например:

  var currentIndex = findIndexByValue(series, "team", current.team_id); 

      if (currentIndex === null) { 
       series.push({ 
        team: current.team_id, 
        data: [dTemp, current.avg] 
       }); 
      } else { 
       series[currentIndex].data.push([dTemp, current.score]); 
      } 

Это может быть сделано как одна функция:

function manageSeries (series, name, key, xVal, yValName) { 
      var currentIndex = findIndexByValue(series, name, current[key]), 
       seriesObj = {}; 

      if (currentIndex === null) { 
       seriesObj[name] = current[key]; 
       seriesObj.data = [dTemp, current[yValName]]; 
       series.push(seriesObj); 
      } else { 
       series[currentIndex].data.push([dTemp, current[yValName]); 
      } 
} 

Теперь просто:

if (this.currentype === "allTeamSeries") { 
    manageSeries(series, 'team', 'team_id', dTemp, 'avg'); 
else if (this.currentResource === "playerseries") { 
    manageSeries(series, 'player', 'player_id', dTemp, 'score'); 
} else if (this.currentTeam === current.team_id) { 
    manageSeries(series, 'site', 'site_id', dTemp, 'score'); 
} 

Примечание: код не проверен, потому что я не мог настроить рабочую демонстрацию в соответствии с вы предоставили, извините.

Смежные вопросы