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

修改资产potential loss时quota取最后索引值、报NaN错误如何解决

问题根因

  • 事件逻辑错误:你在监听到某个资产的potential loss修改后,循环了所有资产的索引,每次都给当前触发修改的那一个资产的quota输入框赋值,循环结束后自然只会保留最后一个索引对应的计算值
  • 类型未转换:输入框获取的value是字符串类型,未转换为数字直接参与计算,导致出现NaN报错
  • 缓存值过时:第二种方案里的test数组仅在初始化时赋值,用户手动修改quota值后不会同步更新,计算时用了旧值甚至空值
  • 事件绑定范围错误:第一种方案仅给页面加载时存在的第一个.perda元素绑定了事件,后续新增的资产对应的potential loss输入框不会触发监听逻辑

修复方案

1. Potential Loss修改逻辑重写

不需要提前缓存quota数组,每次触发修改时先定位当前资产的索引,直接从slices数组取对应资产的原始quota值计算即可,参考代码如下:

// 统一用事件委托监听所有.perda输入框的input事件,兼容后续新增的资产
document.querySelector(".loss").addEventListener("input", function (e) {
  const tgt = e.target;
  if (!tgt.classList.contains("perda")) return;

  // 获取当前修改的资产行对应的索引,你HTML里的data-index从1开始,减1对齐数组下标
  const currentRow = tgt.closest(".tr");
  const currentIndex = parseInt(currentRow.dataset.index) - 1;

  // 所有取值先转数字,加容错避免NaN
  const originQuota = Number(slices[currentIndex].quota);
  const lossVal = Number(tgt.value) || 0;
  const assetCount = slices.length;
  const indexSumRatio = 1 / assetCount;

  // 仅更新当前行的quota,同时同步到slices数组保证数据一致
  const newQuota = Math.round(originQuota - lossVal * indexSumRatio);
  currentRow.querySelector(".quota").value = newQuota;
  slices[currentIndex].quota = newQuota;

  // 如需修改后自动刷新饼图,放开下面的注释即可
  // drawChart();
});

2. 补充quota手动修改同步逻辑

给quota输入框加事件监听,用户手动修改quota值时同步更新到slices数组,保证后续计算用的是最新值:

document.querySelector(".loss").addEventListener("input", function (e) {
  const tgt = e.target;
  if (!tgt.classList.contains("quota")) return;
  const currentRow = tgt.closest(".tr");
  const currentIndex = parseInt(currentRow.dataset.index) - 1;
  slices[currentIndex].quota = Number(tgt.value) || 0;
});

3. 新增资产逻辑适配

写addStock新增资产的逻辑时,要给新生成的.tr节点的data-index属性按顺序赋值,保证索引和slices数组的下标一一对应即可。

内容的提问来源于stack exchange,提问作者user16845627

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:45:04