You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

React实现身高别体重Z分数计算时遇到Cannot find name '_'.ts(2304)错误的解决及功能完善求助

React实现身高别体重Z分数计算时遇到Cannot find name '_'.ts(2304)错误的解决及功能完善求助

首先解决你遇到的Cannot find name '_'.ts(2304)错误:这个问题很明确——你用了Lodash的_.filter方法,但你的项目里要么没安装Lodash,要么没在文件里引入它,或者没装对应的TypeScript类型声明。

错误修复步骤:

  • 第一步:安装Lodash和它的TypeScript类型包
    在终端运行下面的命令(根据你用的包管理器选一个):
    npm install lodash @types/lodash
    # 或者用yarn
    yarn add lodash @types/lodash
    
  • 第二步:在你的组件文件顶部引入Lodash
    可以全局引入整个Lodash库:
    import _ from 'lodash';
    
    也可以按需引入filter方法,减小打包体积:
    import { filter } from 'lodash';
    
    对应的代码里的_.filter就要改成filter

接下来,我看你的代码还只是完成了参考数据筛选的部分,还没实现Z分数的计算逻辑,这里给你完善一下思路和代码:

身高别体重Z分数(Weight-for-Height Z-score)的计算逻辑一般是基于WHO的儿童生长标准,公式是:Z = (实际体重 - 对应身高的中位数体重) / 对应身高的标准差,并且通常会把Z分数截断在±4之间(超出范围的按±4处理)。

完善后的代码示例:

// 先确保已经引入Lodash
import _ from 'lodash';

const calcWeightForHeightZscore = (weightForHeightRef: any[], height: string | number, weight: string | number) => {
  let formattedWHValue = -4; // 默认返回-4(异常值)
  const parsedHeight = typeof height === 'string' ? parseFloat(height) : height;
  const parsedWeight = typeof weight === 'string' ? parseFloat(weight) : weight;

  const standardHeightMin = 45;
  const standardMaxHeight = 110;

  // 先做输入有效性校验
  if (!parsedHeight || !parsedWeight || isNaN(parsedHeight) || isNaN(parsedWeight)) {
    return formattedWHValue;
  }

  // 检查身高是否在有效范围内
  if (parsedHeight < standardHeightMin || parsedHeight > standardMaxHeight) {
    return formattedWHValue;
  }

  // 筛选对应身高的参考数据,这里用差值比较避免toFixed的浮点数精度问题
  const refSection = _.filter(weightForHeightRef, (refObject) => {
    const refHeight = parseFloat(refObject['Length']);
    // 允许0.05的误差,避免浮点数精度导致匹配失败
    return Math.abs(refHeight - parsedHeight) < 0.05;
  });

  // 确保找到对应的参考数据
  if (refSection.length === 0) {
    return formattedWHValue;
  }

  // 取出参考数据里的中位数和标准差(这里假设你的ref数据结构里有这两个字段,根据实际情况调整)
  const reference = refSection[0];
  const medianWeight = parseFloat(reference.Median);
  const standardDeviation = parseFloat(reference.SD);

  // 计算Z分数,处理标准差为0的特殊情况
  if (standardDeviation !== 0) {
    let zScore = (parsedWeight - medianWeight) / standardDeviation;
    // 截断Z分数到±4之间
    formattedWHValue = Math.max(-4, Math.min(4, zScore));
  } else {
    formattedWHValue = 0;
  }

  return formattedWHValue;
};

几个需要注意的点:

  1. 浮点数精度问题:之前你用toFixed(1)来匹配身高,可能会因为浮点数的精度问题导致匹配失败(比如45.045转成字符串后是一样的,但如果是45.0000001就会变成45.0,而参考数据里的45也会变成45.0,但有时候一些边缘情况会出问题),所以用差值比较更稳妥。
  2. 输入校验:要处理身高或体重不是有效数字的情况,避免计算出错。
  3. 参考数据结构:代码里假设你的weightForHeightRef数据里有Median(中位数体重)和SD(标准差)字段,你需要根据实际的参考数据结构调整字段名。

备注:内容来源于stack exchange,提问作者jonathan

火山引擎 最新活动