javascript - 为什么函数在应该为“n/a”时返回未定义?
问题描述
必须解决的问题是:给你一串0-9之间的数字。找到这些数字的平均值,并将其作为一个整数(即:没有小数位)作为字符串返回。例如:
“零九五二”->“四”
如果字符串为空或包含大于 9 的数字,则返回“n/a”这是我目前的解决方案:
function averageString(str) {
var thelast = [];
var obj = {
"zero": 0,
"one": 1,
"two": 2,
"three": 3,
"four": 4,
"five": 5,
"six": 6,
"seven": 7,
"eight": 8,
"nine": 9
}
var sum = 0;
var nums = []
var string = str.split(" ");
string.forEach(el => {
nums.push(obj[`${el}`])
})
if (str == " ") {
thelast.push("n/a")
} else {
nums.forEach(el => {
if (el > 9) {
thelast.push("n/a")
} else {
sum += el
}
})
var final = Math.floor(sum / nums.length);
for (var prop in obj) {
if (obj[prop] == final) {
thelast.push(prop)
}
}
}
return thelast[0]
}
console.log(averageString("one two ten four five"));
但是为什么当解决方案应该是'n/a'时它返回未定义?
解决方案
问题是只有"n/a"
在查找后的数字大于 9 时才会返回。但是如果查找 value "ten"
,它将返回undefined
,因为您没有案例。您不能添加所有大于 9 的值,因为它们的数量是无限的。str
(如果为空,您也会遇到问题""
。)
您需要做的是检查是否从 lookup 返回的值=== undefined
。
然而,更好的是,您可以有一个适当的验证步骤,在对其执行任何计算之前检查函数接收到的输入。您已经被告知什么是有效输入,什么不是,因此您需要返回true
输入是否有效和无效的代码false
。如果输入无效,则返回"n/a"
,否则计算并返回平均值。
在将验证拆分为自己的函数之后,我冒昧地将其他部分提取到自己的函数中。总体实现方法保持不变,但可能更易于遵循。
我看到您正在使用Array.forEach
,因此我建议您查看Array.map
,Array.reduce
和Array.some
。
function textToNum(str) {
var numbers = {
"zero": 0,
"one": 1,
"two": 2,
"three": 3,
"four": 4,
"five": 5,
"six": 6,
"seven": 7,
"eight": 8,
"nine": 9
};
return numbers[str];
}
function numToText(str) {
var numbers = [
"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine"
];
return numbers[str];
}
function validateInput(str) {
var numbers = str.split(" ");
return numbers.length > 0 && !numbers.some(num => textToNum(num) === undefined);
}
function averageString(str) {
if (!validateInput(str)) {
return "n/a";
}
// Now we know that the input is valid
var sum = 0;
var nums = [];
var string = str.split(" ");
string.forEach(el => {
nums.push(textToNum(el));
});
nums.forEach(el => {
sum += el;
});
var final = Math.floor(sum / nums.length);
return numToText(final);
}
console.log(averageString("one two four five"));
console.log(averageString("one two ten four five"));
console.log(averageString("one two four five thirty"));
推荐阅读
- c# - 网络核心 MVC 框架
- php - 如何在 PHP 类中获取 url 参数
- c# - 选择 MKPolygon 点击
- javascript - 如何使用 React 动态更改 google recaptcha 语言
- laravel - 在生产中找不到类“Srmklive\PayPal\Facades\Paypal”
- python - 如何动态加载python模块并在每个模块上调用方法?
- bash - 是否有 bash 命令可以在输出中获取由制表符分隔的第 5 个字段?
- c++ - 跨平台指向库
- git - 为什么我无法提交我在 git 的 master 中意外删除的文件夹?
- android - 自动在 gradle 上添加模块依赖