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
相关产品推荐
相关产品推荐

