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

AngularJS控制器循环异常:传入840未返回预期USD问题求助

问题分析

你的问题核心出在循环未在找到匹配项后终止,加上变量赋值逻辑的漏洞:

当调用showCurrencyT("840")时:

  • 第一次循环(i=0):匹配到US Dollar,symbol被设为USD
  • 第二次循环(i=1):不匹配Turkish Lira,进入else分支,symbol被重新赋值为传入的840
  • 循环结束后,symbol的最终值被覆盖成840,所以返回错误结果

而调用showCurrencyT("949")时刚好是反向巧合:

  • 第一次循环(i=0):不匹配,symbol设为949
  • 第二次循环(i=1):匹配到Turkish Lira,symbol被更新为TRY
  • 最终返回正确结果,但这只是偶然情况

另外还有个细节问题:用var声明symbol会导致变量提升,循环内的赋值会持续覆盖外部的变量值,加重了问题。

修复方案

方案1:修复循环逻辑,找到匹配项后终止循环

在找到目标货币后立即跳出循环,避免后续循环覆盖正确的symbol值:

$scope.showCurrencyT = function(invCurrency){
  // 先初始化默认值为传入的invCurrency
  let symbol = invCurrency;
  const currencies = $scope.pageInfo.currencies;
  // 用动态长度代替硬编码的2,适配货币列表变化
  for (let i=0; i < currencies.length; i++) {
    console.log("i is " +i);
    if (parseInt(currencies[i].currencyCode) === parseInt(invCurrency) ) {
      console.log('passed '+ i + ' ' + currencies[i].currencyCode );
      // 找到匹配项,更新symbol
      symbol = currencies[i].symbol;
      console.log(symbol);
      // 找到后立即终止循环,防止后续覆盖
      break;
    } else {
      console.log(i +" else");
    }
  }
  console.log("final symbol is " + symbol);
  return symbol;
}

方案2:用数组find方法简化代码(更推荐)

AngularJS环境下可以直接用数组的find方法查找匹配项,代码更简洁且逻辑更清晰:

$scope.showCurrencyT = function(invCurrency){
  const targetCurrency = $scope.pageInfo.currencies.find(curr => 
    parseInt(curr.currencyCode) === parseInt(invCurrency)
  );
  // 找到匹配项返回symbol,否则返回传入的默认值
  const symbol = targetCurrency ? targetCurrency.symbol : invCurrency;
  console.log("final symbol is " + symbol);
  return symbol;
}
关键优化点
  • 提前初始化symbol为默认值,避免循环内重复赋值
  • 找到匹配项后立即终止循环(方案1),或用find直接获取第一个匹配项(方案2)
  • 用let代替var声明变量,避免变量提升带来的作用域问题
  • 用$scope.pageInfo.currencies.length代替硬编码的2,保证逻辑适配货币列表的动态变化

修改后,调用{{showCurrencyT("840")}}就能正确返回USD了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:42:32