首页 > 解决方案 > 为什么函数在应该为“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'时它返回未定义?

标签: javascript

解决方案


问题是只有"n/a"在查找后的数字大于 9 时才会返回。但是如果查找 value "ten",它将返回undefined,因为您没有案例。您不能添加所有大于 9 的值,因为它们的数量是无限的。str(如果为空,您也会遇到问题""。)

您需要做的是检查是否从 lookup 返回的值=== undefined

然而,更好的是,您可以有一个适当的验证步骤,在对其执行任何计算之前检查函数接收到的输入。您已经被告知什么是有效输入,什么不是,因此您需要返回true输入是否有效和无效的代码false。如果输入无效,则返回"n/a",否则计算并返回平均值。

在将验证拆分为自己的函数之后,我冒昧地将其他部分提取到自己的函数中。总体实现方法保持不变,但可能更易于遵循。

我看到您正在使用Array.forEach,因此我建议您查看Array.map,Array.reduceArray.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"));


推荐阅读