You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
      }

问题分析

  1. stockprice未定义错误:const声明的变量作用域仅限于当前代码块,if-else块内定义的stockprice无法在块外被访问,导致后续代码找不到该变量。
  2. 日期生成不符合需求:原代码生成的是当月内的随机日期,而非按天递增的序列。
  3. 股价逻辑错误:原代码每次都用初始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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 14:30:39