ReactJS:如何在createData函数中获取上一个生成的stockprice?
解决生成股票序列数据时的上一个股价获取问题
需要生成一组股票数据,要求:
- 第一个元素的
stock_price使用传入的初始参数,后续元素的stock_price基于上一个元素的数值按随机百分比增减 - 日期从今日开始,每天递增
purchase_price使用当前stock_price结合指定参数计算- 之前尝试的代码出现
stockprice未定义错误,同时日期生成逻辑不符合需求
原始代码
function createData(stock, purchase, percentdown) { const dataarray=[] for(let i = 1; i < 59; i++) { const startdate = new Date() const enddate = new Date(startdate.setMonth(startdate.getMonth(), 1)) const date = new Date(startdate.getTime() + Math.random() * (enddate.getTime() - startdate.getTime())) const dateFormat = date.getMonth() + 1 + '/' + date.getDate() + '/' + date.getFullYear() // 上述代码无法生成正确日期 // 除第一个元素外,后续元素需使用上一个生成的stockprice const stockprice = stock * Math.floor(Math.random() * 10); const percent = Math.floor(Math.random() * 10) const percentDiff = (stockprice*percent)/100 const purchaseprice = parseInt(stockprice) - percentDiff const message = MessageFilter(purchaseprice, stock, percent) dataarray.push( { id:i, date:dateFormat, stock_price:stockprice, purchase_price:purchaseprice, message:message } ) } return dataarray }
期望输出
//使用示例日期和ID [ { id:1, date:11/06/2022, stock_price: 12000, purchase_price: 11400, message:message }, { id:2, date:11/07/2022, //日期递增1天 stock_price: 12600, //基于上一个stock_price(id:1)按随机百分比增减 purchase_price: 11400, //使用当前stock_price计算 message:message }, { id:3, date:11/08/2022, //日期递增1天 stock_price: 12300, //基于上一个stock_price(id:2)按随机百分比增减 purchase_price: 11400, //使用当前stock_price计算 message:message } ]
之前尝试的错误代码
if (i === 1) { const stockprice = stock * Math.floor(Math.random() * 10); } else { const { stock } = dataarray[dataarray.length - 1]; const stockprice = stock * Math.floor(Math.random() * 10); }
问题分析
- stockprice未定义错误:
const声明的变量作用域仅限于当前代码块,if-else块内定义的stockprice无法在块外被访问,导致后续代码找不到该变量。 - 日期生成不符合需求:原代码生成的是当月内的随机日期,而非按天递增的序列。
- 股价逻辑错误:原代码每次都用初始
stock计算新股价,没有基于上一个元素的stock_price。
修正后的完整代码
function createData(initialStock, initialPurchase, percentDown) { const dataArray = []; // 初始化起始日期为今日 let currentDate = new Date(); for (let i = 1; i < 59; i++) { // 格式化日期:月/日/年,日期补零保证格式统一 const dateFormat = `${currentDate.getMonth() + 1}/${String(currentDate.getDate()).padStart(2, '0')}/${currentDate.getFullYear()}`; let stockPrice; if (i === 1) { // 第一个元素使用传入的初始股价 stockPrice = initialStock; } else { // 获取上一个元素的stock_price const prevStockPrice = dataArray[dataArray.length - 1].stock_price; // 生成-10%到+10%之间的随机波动百分比(可按需调整范围) const changePercent = (Math.random() * 20 - 10) / 100; // 计算新股价并保留整数 stockPrice = Math.round(prevStockPrice * (1 + changePercent)); } // 根据percentDown计算采购价 const purchasePrice = Math.round(stockPrice * (1 - percentDown / 100)); // 调用消息过滤函数(假设该函数已提前定义) const message = MessageFilter(purchasePrice, stockPrice, percentDown); dataArray.push({ id: i, date: dateFormat, stock_price: stockPrice, purchase_price: purchasePrice, message: message }); // 日期递增1天 currentDate.setDate(currentDate.getDate() + 1); } return dataArray; }
关键修正点
- 变量作用域调整:将
stockPrice用let声明在if-else块外,确保后续代码能正常访问。 - 股价生成逻辑:从第二个元素开始,通过
dataArray[dataArray.length - 1].stock_price获取上一个元素的股价,再基于随机百分比计算新股价。 - 日期递增逻辑:初始化
currentDate为今日,每次循环后调用setDate实现日期按天递增。 - 参数对应:严格按照传入的初始参数生成对应数据,采购价计算逻辑与
percentDown绑定。
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

