javascript - 如何使用其他数组为 ApexCharts 动态创建和命名 N 个数据系列?

标签 javascript arrays dynamic apexcharts

我正在使用 ApexCharts 显示数据库中的数据,它工作得很好,直到我必须创建多个数据系列。我以多个数组的形式获取数据,如下所示(注意:我没有获取水果列表,只是为了示例)

var fruits = ["apple","apple","apple","apple","apple"]; // Name of the fruit
var dates = ["2019-04-01","2019-04-02","2019-04-03","2019-04-04","2019-04-05"];
var values = [14,9,17,5,11];

水果[0]与日期[0]和值[0]一起使用(将它们视为数据库中的行)。

在这种情况下,我只有一个数据系列要传递给 ApexCharts,我可以这样做:

var matchedData = [];

// I create nested arrays in matchedData, each array corresponding to a tuple, like so : matched[0] = [dates[0],values[0]]
for(let i = 0; i < fruits.length; i++) {
    date = new Date(dates[i]); // To transform the date string to Javascript timestamp
    matchedData[i] = [date.getTime(),values[i]];
}

var options = {
    chart: {
        type: 'line'
    },
    series: [{
        label: "Data",
        data: matchedData
    }],
    xaxis: {
        type: 'datetime'
    },
}

var chart = new ApexCharts(document.getElementById('chart'), options);
chart.render();

但它仅在“fruits”数组仅包含一种水果而不包含不同种类的水果时才有效。所以如果我的数组是这样的:

var fruits = ["apple","banana","apple","banana","strawberry"];
var dates = ["2019-04-01","2019-04-02","2019-04-03","2019-04-04","2019-04-05"];
var values = [14,9,17,5,11];

我必须动态创建 3 个数组,每个数组都以水果命名(在本例中为“苹果”、“香蕉”和“草莓”),每个数组都包含相应的日期和值。每个数组看起来像这样:

apple = [
            ["2019-04-01", 14], // I wrote the time in string for readability here but in reality it would be written in the JavaScript timestamp format
            ["2019-04-03", 17]
        ];

banana = [
            ["2019-04-02", 9], 
            ["2019-04-04", 5]
         ];

strawberry = [
                 ["2019-04-05",11]
             ];

这些数据系列将像这样传递到 ApexCharts:

var options = {
        chart: {
            type: 'line'
        },
        series: [
            {
                label: "apple",
                data: apple
            },{
                label: "banana",
                data: banana
            },{
                label: "strawberry",
                data: strawberry
            }
        ],
        xaxis: {
            type: 'datetime'
        },
    }

var chart = new ApexCharts(document.getElementById('chart'), options);
chart.render();

我的问题如下:

我不知道在运行时之前需要创建多少个系列,我不知道它们的名称,也不知道如何将它们动态传递给 ApexCharts(如果有 N 个系列,我需要N {label/data} 子句)。

我已经开始了一个为每个水果动态创建数组的解决方案,它看起来像这样:

for(let i = 0; i < fruits.length; i++) {

    if(fruits[i] in window) {
        date = new Date(dates[i]);
        window[fruits[i]].push([date.getTime(),values[i]]);
    } else {
        window[lines[i]] = [];
        date = new Date(dates[i]);
        window[lines[i]].push([date.getTime(),values[i]]);
    }

}

然后我就可以访问每个数组,但前提是已经知道“fruits”数组中的不同值。

最佳答案

您可以使用以下方法按水果分组。

var fruits = ["apple","banana","apple","banana","strawberry"];
var dates = ["2019-04-01","2019-04-02","2019-04-03","2019-04-04","2019-04-05"];
var values = [14,9,17,5,11];

let result = fruits.reduce((a, f, i) => {
  (a.result[f] || (a.result[f] = [])).push([a.dates[i], a.values[i]]);
  return a;
}, {dates, values, result: {}}).result;

// now, you can get the apple info as follow:
console.log(JSON.stringify(result["apple"], null, 1));
console.log(JSON.stringify(result, null, 1));
.as-console-wrapper { min-height: 100%; }

关于javascript - 如何使用其他数组为 ApexCharts 动态创建和命名 N 个数据系列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55814113/

相关文章:

javascript - 为什么我不能调用 action 来调度?

php - 将 foreach 循环限制为第一个数组

c# - 如何在 C# 中将用户输入转换为 int 数组

c++ - 无法将 'notes' 从 'std::array<double, 6u>' 转换为 'std::array<double, 7u>

python - 基于 Django + Celery 的应用程序的动态(即运行时可配置)日志配置

javascript 和 DHTML 影响

c# - 使用 javascript 访问客户端 RadGrid <DetailItemTemplate> 中的 TextBox 控件

javascript - 使用 jQuery 从一个选择框(选择组和选定选项)获取 2 个值

java - 返回到 Struts 2 中输入结果的当前页面

swift - UICollectionView 的 Header 高度取决于 Swift 中的内容