在js中解析数组

时间:2016-02-02 13:20:35

标签: javascript arrays highcharts ampersand.js

对于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: [...]
 }]

此外,代码看起来多余,有一些技巧可以让一些数组函数更容易做到吗?

在此先感谢,对我来说这是个大问题!

1 个答案:

答案 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');
}

注意:代码未经过测试,因为我无法根据您提供的信息设置工作演示,抱歉。