js代码解析:获取服务器数据并展示
connygpt 2024-12-08 14:22 8 浏览
<script>
const EXCHANGE_MAP = {
'SHFE': 113,
'DCE': 114,
'CZCE': 115,
'GFEX': 225,
'INE': 142,
'CFFEX': 220
};
async function fetchVarieties() {
try {
const response = await fetch('https://q.xxx.biz/');
const data = await response.json();
const groupedData = {};
data.list.forEach(item => {
const [exchange, code] = item.uid.split('|');
const variety = code.replace(/\d+/g, '');
if (!groupedData[exchange]) {
groupedData[exchange] = new Set();
}
groupedData[exchange].add({
code: variety,
name: item.name.replace(/\d+/g, '')
});
});
const select = document.getElementById('varietySelect');
Object.entries(groupedData).forEach(([exchange, varieties]) => {
const optgroup = document.createElement('optgroup');
optgroup.label = exchange;
varieties.forEach(variety => {
const option = document.createElement('option');
option.value = `${EXCHANGE_MAP[exchange]}_${variety.code}`;
option.textContent = variety.name;
optgroup.appendChild(option);
});
select.appendChild(optgroup);
});
} catch (error) {
console.error('Error fetching varieties:', error);
}
}
async function fetchContracts(variety) {
try {
const response = await fetch(`https://q.xxx.ink/redis?msgid=${variety}`);
const data = await response.json();
return data
.filter(item => /\d+/.test(item.code))
.map(item => `${item.mktid}_${item.code}`);
} catch (error) {
console.error('Error fetching contracts:', error);
return [];
}
}
async function fetchPrices(contracts) {
try {
console.log('Fetching prices for contracts:', contracts);
const response = await fetch(`https://q.xxx.ink/custom/${contracts.join(',')}?orderBy=code&sort=asc&pageSize=100&pageIndex=0&callbackName=`);
const text = await response.text();
console.log('Raw response:', text);
const jsonStr = text.replace(/^[^({]*\(|\)[^}]*$/g, '');
console.log('Processed JSON string:', jsonStr);
try {
const data = JSON.parse(jsonStr);
console.log('Parsed data:', data);
if (data && Array.isArray(data.list)) {
return data.list;
}
return [];
} catch (parseError) {
console.error('Error parsing JSON:', parseError);
console.log('Problematic JSON string:', jsonStr);
return [];
}
} catch (error) {
console.error('Error fetching prices:', error);
return [];
}
}
function updatePriceTable(prices) {
const tbody = document.querySelector('#priceData tbody');
tbody.innerHTML = '';
if (!Array.isArray(prices) || prices.length === 0) {
const row = document.createElement('tr');
row.innerHTML = '<td colspan="4" style="text-align: center;">暂无数据</td>';
tbody.appendChild(row);
return;
}
prices.forEach(item => {
const row = document.createElement('tr');
row.innerHTML = `
<td>${item.name || '-'}</td>
<td>${item.p || '-'}</td>
<td>${item.zdf || '-'}%</td>
<td>${item.vol || 0}</td>
<td>${item.ccl || 0}</td>
`;
tbody.appendChild(row);
});
}
function sortContracts(prices) {
return prices.sort((a, b) => {
const monthA = a.name.match(/\d+/)[0];
const monthB = b.name.match(/\d+/)[0];
return monthA - monthB;
});
}
function updateChart(prices) {
const chartDom = document.getElementById('chartContainer');
const myChart = echarts.init(chartDom);
const sortedPrices = sortContracts(prices);
const option = {
title: {
text: '月间合约对比',
left: 'center'
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross'
}
},
legend: {
data: ['价格', '成交量', '持仓量'],
top: 30,
left: 'center'
},
grid: [{
left: '3%',
right: '3%',
height: '50%'
}, {
left: '3%',
right: '3%',
top: '65%',
height: '25%'
}],
xAxis: [{
type: 'category',
data: sortedPrices.map(item => item.name),
axisLine: { onZero: true },
grid: { top: '50%' }
}, {
type: 'category',
gridIndex: 1,
data: sortedPrices.map(item => item.name),
position: 'bottom'
}],
yAxis: [{
name: '价格',
type: 'value',
splitLine: {
show: true
},
min: function (value) {
return value.min * 0.99; // 设置 Y 轴最小值为数据最小值的 0.9 倍
},
max: function (value) {
return value.max * 1.01; // 设置 Y 轴最大值为数据最大值的 1.1 倍
}
}, {
gridIndex: 1,
name: '成交量/持仓量',
type: 'value',
splitLine: {
show: true
},
min: function (value) {
return value.min * 0.99; // 设置 Y 轴最小值为数据最小值的 0.9 倍
},
max: function (value) {
return value.max * 1.01; // 设置 Y 轴最大值为数据最大值的 1.1 倍
}
}],
series: [{
name: '价格',
type: 'line',
data: sortedPrices.map(item => item.p || 0),
smooth: true,
lineStyle: {
width: 2
},
itemStyle: {
color: '#5470c6'
}
}, {
name: '成交量',
type: 'bar',
xAxisIndex: 1,
yAxisIndex: 1,
data: sortedPrices.map(item => item.vol || 0),
itemStyle: {
color: '#91cc75'
}
}, {
name: '持仓量',
type: 'bar',
xAxisIndex: 1,
yAxisIndex: 1,
data: sortedPrices.map(item => item.ccl || 0),
itemStyle: {
color: '#fac858'
}
}],
dataZoom: [{
type: 'inside',
xAxisIndex: [0, 1],
start: 0,
end: 100
}, {
show: true,
xAxisIndex: [0, 1],
type: 'slider',
bottom: 10,
start: 0,
end: 100
}]
};
myChart.setOption(option);
window.addEventListener('resize', () => {
myChart.resize();
});
}
document.getElementById('varietySelect').addEventListener('change', async (e) => {
const variety = e.target.value;
if (!variety) {
document.getElementById('contractList').textContent = '';
updatePriceTable([]);
const chartDom = document.getElementById('chartContainer');
const myChart = echarts.init(chartDom);
myChart.clear();
return;
}
document.querySelector('.loading').style.display = 'block';
try {
const contracts = await fetchContracts(variety);
document.getElementById('contractList').textContent =
`[${contracts.map(c => c.split('_')[1]).join(',')}]`;
const prices = await fetchPrices(contracts);
updatePriceTable(prices);
if (prices && prices.length > 0) {
updateChart(prices);
}
} catch (error) {
console.error('Error updating data:', error);
document.getElementById('contractList').textContent = '获取数据失败';
updatePriceTable([]);
} finally {
document.querySelector('.loading').style.display = 'none';
}
});
// 从URL中获取默认品种
(async function() {
const urlParams = new URLSearchParams(window.location.search);
const defaultVariety = urlParams.get('variety');
if (defaultVariety) {
document.getElementById('varietySelect').value = defaultVariety;
await fetchContracts(defaultVariety);
const contracts = await fetchContracts(defaultVariety);
document.getElementById('contractList').textContent =
`[${contracts.map(c => c.split('_')[1]).join(',')}]`;
const prices = await fetchPrices(contracts);
updatePriceTable(prices);
if (prices && prices.length > 0) {
updateChart(prices);
}
} else {
await fetchVarieties();
}
})();
</script>
这段代码涉及到了很多JavaScript的知识点,以下是一些主要的知识点:
1. 变量和常量
●使用const声明常量,例如EXCHANGE_MAP。
●变量的解构赋值,如const [exchange, code] = item.uid.split('|');。
2. 数据结构
●使用对象({})和Map进行数据存储和检索。
●使用Set来存储唯一值。
3. 异步编程
●使用async/await进行异步操作,简化Promise的使用。
●使用fetchAPI进行网络请求。
4. 数组和字符串方法
●数组的forEach、map、filter等方法。
●字符串的split、replace、match等方法。
5. DOM操作
●使用document.getElementById、document.createElement等方法操作DOM。
●使用appendChild方法添加子元素。
6. 事件处理
●使用addEventListener为DOM元素添加事件监听器。
7. 错误处理
●使用try...catch语句进行错误捕获和处理。
8. JSON处理
●使用JSON.parse解析JSON字符串。
●处理JSON解析错误。
9. 正则表达式
●使用正则表达式进行字符串匹配和替换,如/\d+/g。
10. 排序
●使用数组的sort方法进行排序。
11. ECharts库
●使用ECharts库进行数据可视化,包括图表的配置和更新。
12. 模块化
●代码结构体现了模块化的思想,将不同的功能封装在不同的函数中。
13. 立即执行函数表达式(IIFE)
●使用IIFE来封装一些初始化代码,避免污染全局作用域。
14. URL和查询参数处理
●使用URLSearchParams处理URL查询参数。
15. 条件渲染
●根据数据是否存在来决定渲染内容,例如在没有数据时显示“暂无数据”。
这些知识点覆盖了JavaScript的基础语法、异步编程、DOM操作、数据处理和可视化等多个方面,展示了现代JavaScript开发的综合应用。
相关推荐
- 自学Python,写一个挨打的游戏代码来初识While循环
-
自学Python的第11天。旋转~跳跃~,我~闭着眼!学完循环,沐浴着while的光芒,闲来无事和同事一起扯皮,我说:“编程语言好神奇,一个小小的循环,竟然在生活中也可以找到原理和例子”,同事也...
- 常用的 Python 工具与资源,你知道几个?
-
最近几年你会发现,越来越多的人开始学习Python,工欲善其事必先利其器,今天纬软小编就跟大家分享一些常用的Python工具与资源,记得收藏哦!不然下次就找不到我了。1、PycharmPychar...
- 一张思维导图概括Python的基本语法, 一周的学习成果都在里面了
-
一周总结不知不觉已经自学Python一周的时间了,这一周,从认识Python到安装Python,再到基本语法和基本数据类型,对于小白的我来说无比艰辛的,充满坎坷。最主要的是每天学习时间有限。只...
- 三日速成python?打工人,小心钱包,别当韭菜
-
随着人工智能的热度越来越高,许多非计算机专业的同学们也都纷纷投入到学习编程的道路上来。而Python,作为一种相对比较容易上手的语言,也越来越受欢迎。网络上各类网课层出不穷,各式广告令人眼花缭乱。某些...
- Python自动化软件测试怎么学?路线和方法都在这里了
-
Python自动化测试是指使用Python编程语言和相关工具,对软件系统进行自动化测试的过程。学习Python自动化测试需要掌握以下技术:Python编程语言:学习Python自动化测试需要先掌握Py...
- Python从放弃到入门:公众号历史文章爬取为例谈快速学习技能
-
这篇文章不谈江流所专研的营销与运营,而聊一聊技能学习之路,聊一聊Python这门最简单的编程语言该如何学习,我完成的第一个Python项目,将任意公众号的所有历史文章导出成PDF电子书。或许我这个Py...
- 【黑客必会】python学习计划
-
阅读Python文档从Python官方网站上下载并阅读Python最新版本的文档(中文版),这是学习Python的最好方式。对于每个新概念和想法,请尝试运行一些代码片段,并检查生成的输出。这将帮助您更...
- 公布了!2025CDA考试安排
-
CDA数据分析师报考流程数据分析师是指在不同行业中专门从事行业数据搜集、整理、分析依据数据作出行业研究评估的专业人员CDA证书分为1-3级,中英文双证就业面广,含金量高!!?报考条件:满18...
- 一文搞懂全排列、组合、子集问题(经典回溯递归)
-
原创公众号:【bigsai】头条号:程序员bigsai前言Hello,大家好,我是bigsai,longtimenosee!在刷题和面试过程中,我们经常遇到一些排列组合类的问题,而全排列、组合...
- 「西法带你学算法」一次搞定前缀和
-
我花了几天时间,从力扣中精选了五道相同思想的题目,来帮助大家解套,如果觉得文章对你有用,记得点赞分享,让我看到你的认可,有动力继续做下去。467.环绕字符串中唯一的子字符串[1](中等)795.区...
- 平均数的5种方法,你用过几种方法?
-
平均数,看似很简单的东西,其实里面包含着很多学问。今天,分享5种经常会用到的平均数方法。1.算术平均法用到最多的莫过于算术平均法,考试平均分、平均工资等等,都是用到这个。=AVERAGE(B2:B11...
- 【干货收藏】如何最简单、通俗地理解决策树分类算法?
-
决策树(Decisiontree)是基于已知各种情况(特征取值)的基础上,通过构建树型决策结构来进行分析的一种方式,是常用的有监督的分类算法。决策树算法是机器学习中的一种经典算法,它通过一系列的规则...
- 面试必备:回溯算法详解
-
我们刷leetcode的时候,经常会遇到回溯算法类型题目。回溯算法是五大基本算法之一,一般大厂也喜欢问。今天跟大家一起来学习回溯算法的套路,文章如果有不正确的地方,欢迎大家指出哈,感谢感谢~什么是回溯...
- 「机器学习」决策树——ID3、C4.5、CART(非常详细)
-
决策树是一个非常常见并且优秀的机器学习算法,它易于理解、可解释性强,其可作为分类算法,也可用于回归模型。本文将分三篇介绍决策树,第一篇介绍基本树(包括ID3、C4.5、CART),第二篇介绍Ran...
- 大话AI算法: 决策树
-
所谓的决策树算法,通俗的说就是建立一个树形的结构,通过这个结构去一层一层的筛选判断问题是否好坏的算法。比如判断一个西瓜是否好瓜,有20条西瓜的样本提供给你,让你根据这20条(通过机器学习)建立起...
- 一周热门
- 最近发表
- 标签列表
-
- kubectlsetimage (56)
- mysqlinsertoverwrite (53)
- addcolumn (54)
- helmpackage (54)
- varchar最长多少 (61)
- 类型断言 (53)
- protoc安装 (56)
- jdk20安装教程 (60)
- rpm2cpio (52)
- 控制台打印 (63)
- 401unauthorized (51)
- vuexstore (68)
- druiddatasource (60)
- 企业微信开发文档 (51)
- rendertexture (51)
- speedphp (52)
- gitcommit-am (68)
- bashecho (64)
- str_to_date函数 (58)
- yum下载包及依赖到本地 (72)
- jstree中文api文档 (59)
- mvnw文件 (58)
- rancher安装 (63)
- nginx开机自启 (53)
- .netcore教程 (53)