如何使用 JavaScript 中的 Fetch API 从 JSON 数据创建图表?

1. 什么是 Fetch API?

Fetch API 是 JavaScript 新一代的网络请求 API,它是用于替代 XMLHttpRequest(XHR) 的一种方案。该 API 使用 Promise,并且支持 async/await 语法糖,从而可以更加方便地进行网络请求。

下面是一个基础的使用 Fetch API 发送 GET 请求的例子:

fetch('https://api.example.com/data')

.then(response => response.json()) // 解析响应数据

.then(data => console.log(data)) // 打印解析后的数据

.catch(error => console.error(error)) // 捕获异常

1.1 Fetch API 的优点

相比于 XHR,Fetch API 有以下优点:

使用 Promise 可以更加优雅地处理异步请求;

支持 async/await 语法糖,代码更加简洁易读;

使用者可以在任何时候将请求取消(使用 AbortController);

默认不会携带 Cookie,更加安全;

可以使用 Service Worker 进行缓存,加速请求速度。

1.2 JSON 数据格式介绍

在本文中,我们将使用 Fetch API 请求 JSON 格式的数据,并将其转换为图表。下面是一个基础的 JSON 数据格式:

{

"name": "John",

"age": 30,

"city": "New York"

}

JSON 格式由键值对组成,每个键值对之间用逗号隔开。键必须是字符串类型,值可以是字符串、数字、布尔值、数组、对象或 null。

2. 创建图表的准备工作

在本文中,我们将使用 Chart.js 创建图表,因此我们需要在 HTML 文件中引用对应的库文件和一个用于展示图表的 canvas 元素:

<!doctype html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Fetch API 创建图表</title>

<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>

</head>

<body>

<canvas id="myChart"></canvas>

<script src="app.js"></script>

</body>

</html>

在 JavaScript 代码中,我们需要获取 canvas 元素并实例化 Chart.js 对象:

const canvas = document.getElementById('myChart')

const ctx = canvas.getContext('2d')

const chart = new Chart(ctx, {

type: 'bar',

data: {},

options: {}

})

上面的代码使用了 bar 类型的图表,我们也可以使用其他类型,如 line、pie、doughnut 等。更多的信息可以在 Chart.js 文档 中找到。

3. 从 JSON 数据创建图表

在本节中,我们将使用 Fetch API 请求 JSON 数据,并使用 Chart.js 将其转换为图表。

3.1 使用 Fetch API 获取 JSON 数据

我们将使用一个示例数据,其中包含了每个月的销售量和利润。数据的格式如下:

{

"sales": [120, 180, 150, 200, 170, 220, 230, 280, 250, 270, 320, 300],

"profits": [20, 50, 30, 70, 60, 80, 90, 120, 100, 110, 150, 130]

}

我们可以使用 Fetch API 获取该数据,然后使用 response.json() 解析成 JavaScript 对象:

fetch('https://example.com/data.json')

.then(response => response.json())

.then(data => {

console.log(data)

})

.catch(error => console.error(error))

如果数据请求成功并解析成对象,那么将在控制台输出如下内容:

{

"sales": [120, 180, 150, 200, 170, 220, 230, 280, 250, 270, 320, 300],

"profits": [20, 50, 30, 70, 60, 80, 90, 120, 100, 110, 150, 130]

}

3.2 将 JSON 数据转换为 Chart.js 所需数据格式

由于 Chart.js 所需的数据格式和我们从服务器中获取的 JSON 数据不同,因此需要进行转换。

比如,Chart.js 所需的数据格式如下:

{

labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']

datasets: [

{

label: 'Sales',

data: [120, 180, 150, 200, 170, 220, 230, 280, 250, 270, 320, 300],

backgroundColor: 'rgba(255, 99, 132, 0.2)',

borderColor: 'rgba(255, 99, 132, 1)'

},

{

label: 'Profits',

data: [20, 50, 30, 70, 60, 80, 90, 120, 100, 110, 150, 130],

backgroundColor: 'rgba(54, 162, 235, 0.2)',

borderColor: 'rgba(54, 162, 235, 1)'

}

]

}

我们需要按照上面的格式将获取到的 JSON 数据转换成 Chart.js 所需格式,其中 labels 表示 X 轴的标签,datasets 表示 Y 轴的数据集合,可以包含多个数据集合。

fetch('https://example.com/data.json')

.then(response => response.json())

.then(data => {

const chartData = {

labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],

datasets: [

{

label: 'Sales',

data: data.sales,

backgroundColor: 'rgba(255, 99, 132, 0.2)',

borderColor: 'rgba(255, 99, 132, 1)'

},

{

label: 'Profits',

data: data.profits,

backgroundColor: 'rgba(54, 162, 235, 0.2)',

borderColor: 'rgba(54, 162, 235, 1)'

}

]

}

console.log(chartData)

})

.catch(error => console.error(error))

上面的代码中,我们将获取到的 sales 和 profits 数据分别放在 Chart.js 数据格式的 datasets 中。

3.3 在页面上绘制图表

现在我们已经准备好了 Chart.js 所需的数据格式,可以在页面上绘制图表了。

fetch('https://example.com/data.json')

.then(response => response.json())

.then(data => {

const chartData = {

labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],

datasets: [

{

label: 'Sales',

data: data.sales,

backgroundColor: 'rgba(255, 99, 132, 0.2)',

borderColor: 'rgba(255, 99, 132, 1)'

},

{

label: 'Profits',

data: data.profits,

backgroundColor: 'rgba(54, 162, 235, 0.2)',

borderColor: 'rgba(54, 162, 235, 1)'

}

]

}

const canvas = document.getElementById('myChart')

const ctx = canvas.getContext('2d')

const chart = new Chart(ctx, {

type: 'bar',

data: chartData,

options: {

responsive: true,

scales: {

yAxes: [{

ticks: {

beginAtZero: true

}

}]

},

title: {

display: true,

text: 'Sales and Profits in 2021'

}

}

})

})

.catch(error => console.error(error))

上面的代码中,我们将 Chart.js 所需的数据格式 chartData 传递给了 chart 对象的 data 属性,然后对图表进行了一些配置,如使图表可以响应窗口大小改变、在 Y 轴显示的数据从 0 开始、添加一个标题等等。

如果一切正常,将会在页面上看到如下的图表:

4. 总结

本文介绍了如何使用 JavaScript 中的 Fetch API 从 JSON 数据创建图表。首先,我们介绍了 Fetch API 的优点和 JSON 数据格式。接着,我们学习了如何使用 Chart.js,该库可以将数据转换为图表并进行基本的配置。最后,我们将 Fetch API 获取到的 JSON 数据转换成 Chart.js 所需的格式,并在页面上展示了一个示例图表。

了解如何使用 Fetch API 请求数据和使用 Chart.js 创建图表是前端开发中必不可少的技能之一,希望本文对读者有所帮助。