实现嵌套数组操作与货币转换的JavaScript函数问题排查
修复后代码(对象存储版本,推荐)
var currenciesDB = {}; function dynamicConverter(opType, paramArray, targetCurrency) { // 通用参数校验 if (!opType || !paramArray) { return "invalid data provided!"; } if (opType === "add") { // add场景参数校验 if (paramArray.length !== 2 || typeof paramArray[1] !== 'number') { return "invalid data provided!"; } const [currencyName, rate] = paramArray; // 校验币种是否已存在 if (currenciesDB.hasOwnProperty(currencyName)) { return "invalid data provided!"; } currenciesDB[currencyName] = rate; // 返回新增条目数量 return 1; } else if (opType === "convert") { // convert场景参数校验 if (!targetCurrency || paramArray.length !== 2) { return "invalid data provided!"; } const [sourceCurrency, amount] = paramArray; // 校验币种合法性 if (!currenciesDB.hasOwnProperty(sourceCurrency) || !currenciesDB.hasOwnProperty(targetCurrency)) { return "invalid data provided!"; } // 汇率转换逻辑:先转美元再转目标币种 const usdAmount = amount * currenciesDB[sourceCurrency]; const convertedAmount = usdAmount / currenciesDB[targetCurrency]; return convertedAmount; } // 未知操作类型返回错误 return "invalid data provided!"; }
主要修改点
- 存储结构从数组改为对象,直接用币种名作为键,不需要遍历查找,判断存在性和取值都更高效,也解决了原代码中用非数字索引访问数组拿不到值的问题。
- 补全了所有场景的参数校验,覆盖参数缺失、格式非法、币种不存在/重复的错误场景,统一返回要求的错误信息。
- 修正了add逻辑的存在性判断逻辑,原代码中的
toFindIdx函数返回值逻辑完全错误,无法正确匹配已存在的币种。 - 修正了convert逻辑的参数索引错误,原代码错误读取了数组索引1和2,正确的待转换币种和金额对应索引是0和1。
- 调用
dynamicConverter('add', ['euro', 1.2])时第二个参数取值为euro的问题,只要严格按照该写法传递参数,第二个参数会正常拿到完整数组,若仍出现该问题可检查是否有其他代码修改了函数入参,或者调用时误将数组拆分为多个独立参数传递。
数组存储可选版本
如果需要保持最初的数组存储设计,可使用以下版本:
var currenciesDB = []; function dynamicConverter(opType, paramArray, targetCurrency) { if (!opType || !paramArray) { return "invalid data provided!"; } if (opType === "add") { if (paramArray.length !== 2 || typeof paramArray[1] !== 'number') { return "invalid data provided!"; } const [currencyName, rate] = paramArray; const existIndex = currenciesDB.findIndex(item => item[0] === currencyName); if (existIndex !== -1) { return "invalid data provided!"; } currenciesDB.push([currencyName, rate]); return 1; } else if (opType === "convert") { if (!targetCurrency || paramArray.length !== 2) { return "invalid data provided!"; } const [sourceCurrency, amount] = paramArray; const sourceItem = currenciesDB.find(item => item[0] === sourceCurrency); const targetItem = currenciesDB.find(item => item[0] === targetCurrency); if (!sourceItem || !targetItem) { return "invalid data provided!"; } const usdAmount = amount * sourceItem[1]; const convertedAmount = usdAmount / targetItem[1]; return convertedAmount; } return "invalid data provided!"; }
内容的提问来源于stack exchange,提问作者noobAtProgramming
相关产品推荐
相关产品推荐

