对于highcharts,我需要生成解析数据以生成序列。 API中的数据如下所示:
[ 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个团队ID,但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 :(得分: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');
}
注意:代码未经过测试,因为我无法根据您提供的信息设置工作演示,抱歉。