javascript - 显示具有相同源 javascript 数据的多个图表 ( map (key,value) )

标签 javascript twitter-bootstrap

我有一张这种形式的 map

 Object{485:Array[4],2072:Array[4],9665:Array[3]...}

我想为每个键显示一个图表。

我有一个与我正在寻找的示例类似的示例,我尝试在许多图表中显示我的值:在此示例中,我的 key 是:car_id

第一步:对我的数组进行排序以获取带有我的键的 map 。效果很好。但第二个不起作用...我想根据 car_id 和每个面板 Bootstrap 显示每个数据的图表... 我究竟做错了什么 ?

谢谢

<html >

<head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js"></script>
</head>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">

<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">

<!-- Latest compiled and minified JavaScript --><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.0/Chart.min.js"></script>



<script src=" https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.0/Chart.min.js"></script>

<body >
    <div >
        <div class="panel panel-default">
            <div class="panel-heading">Panel heading without title</div>
            <div class="panel-body">
                <canvas id="myChart" width="400" height="400"></canvas>
            </div>
        </div>
    </div>
</body>
<script>var json = {
    'cars': [{
        "car_id": "1",
        "price": "925",
        "full_option": "EEEE"
        }, {
        "car_id": "1",
        "price": "990",
        "full_option": "DDDDD"
        }, {
        "car_id": "2",
        "price": "500",
        "full_option": "FFF"
        }, {
        "car_id": "2",
        "price": "900",
        "full_option": "GGGGGGG"
        }, {
        "car_id": "4",
        "price": "900",
        "full_option": "JJJ"
    }]
};


var car_array = json.cars.reduce((prev, t, index, arr) => {
    if (typeof prev[t.car_id] === 'undefined') {
        prev[t.car_id] = [];
    }
    prev[t.car_id].push(t);
    return prev;
}, {});



Object.keys(car_array).forEach(i => {
    var array_of_cars_with_same_id = car_array[i];
    for (var i=0; i<=array_of_cars_with_same_id.length-1;i++){
        console.log(array_of_cars_with_same_id[i].price);

        var ctx = document.getElementById("myChart");
        var myChart = new Chart(ctx, {
            type: 'bar',
            data: {
                labels: [array_of_cars_with_same_id[i].full_option],
                datasets: [{
                    label: '# of Votes',
                    data: [array_of_cars_with_same_id[i].price]
                }]
            },
            options: {
                scales: {
                    yAxes: [{
                        ticks: {
                            beginAtZero:true
                        }
                    }]
                }
            }
        });

    }
    console.log("AAAAAAAAAAAAA");
});




</script>

最佳答案

您的代码存在一些问题。

首先,您仅使用单个 canvas元素。每个图表都需要自己的 Canvas 元素。因此,您添加的每个图表都会简单地呈现在前一个图表的顶部。

至少,您必须为每个项目提供一个新的 Canvas 。您可以更改代码来实现这一点。

将图表的根元素更改为基本 <div>您要将图表附加到的元素。

<div class="panel-body">
   <div id="chart-holder"></div>
</div>

我将创建一个变量来保存购物车计数和根元素。

var chart_holder = $('#chart-holder');
var chart_count = 0;

更改 for loop使用这些新变量。

for (var i = 0; i <= car_type.length - 1; i++) {
    chart_holder.append('<canvas id="myChart' + chart_count + '" width="400" height="400"></canvas>')

    var ctx = $("#myChart" + chart_count);
    var data = [];
    var myChart = new Chart(ctx, {
      type: 'bar',
      data: {
        labels: [car_type[i].full_option],
        datasets: [{
          label: '# of Votes',
          data: [car_type[i].price]
        }]
      },
      options: chart_opts
    });
    chart_count++;
}

这将为每个数组中的每个对象创建一个新图表。 我创建了a fiddle to demonstrate .

但是,根据数据,我建议采用不同的方法。我会为每个唯一键创建一个图表,而不是为每个元素创建一个图表。

您需要解析每个数组以提取每个图表的标签和数据。这是一个从每个数组中获取数据的示例。有一个变量用于捕获图表的数据和图表的标签。

var car_data = [], car_labels = [];
for (var i = 0; i <= car_type.length - 1; i++) {
    car_data.push(car_type[i].price);
    car_labels.push(car_type[i].full_option);
}

我们可以通过car_datacar_labels到 Chart.js 初始化。

var myChart = new Chart(ctx, {
  type: 'bar',
  data: {
    labels: car_labels,
    datasets: [{
      label: 'Car Type ' + ct,
      data: car_data
    }]
  },
  options: chart_opts
});

这是一个fiddle to demonstrate a single chart per car_id .

关于javascript - 显示具有相同源 javascript 数据的多个图表 ( map (key,value) ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37055039/

相关文章:

javascript - 单击按钮时强制下载pdf

javascript - CSP : Refused to execute inline script

javascript - 如何通过 $refs 将类添加到 Vue 组件

javascript - 在 html 中,打开一个具有选定背景颜色的新窗口

javascript - 是否可以让这个 YouTube 视频自动播放并填满 100% 的屏幕

css - 为什么我的 Bootstrap 3 按钮图标不显示?

html <a> 在菜单内不可点击

twitter-bootstrap - Bootstrap UI - 如何在选项卡展开时更改 Accordion 标题图标?

javascript - 在 SQL 中加载 Bootstrap 模式

javascript - 为什么单击下拉菜单时导航栏中的下拉菜单不起作用?