提问者:小点点

为什么函数应该是“n/a”却返回未定义?


必须解决的问题是:给你一串0-9之间的数字。 找到这些数字的平均值,并将其作为一个泛整数返回(即:没有小数位),写成字符串。 例如:

“零九五二”->; “四”

如果字符串为空或包含大于9的数字,则返回“n/a”这是我到目前为止的解决方案:

null

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"));

null

但是为什么当解应该是'n/a'时它返回未定义呢?


共2个答案

匿名用户

当您测试空字符串时,您应该测试undefined,因为大于“9”的数字在obj变量中没有被定义为键。 函数不能给出大于9的数字,因为您还没有定义这些数字。 这也改进了函数,因为它可以处理其他随机字符串,比如“dog”,或者像“for”这样的拼写错误。

如果(el===未定义){TheLast.Push(“n/a”)}

匿名用户

当前,您的代码正在处理任何大于9,且具有未定义的。 您需要做的是检查该值是否未定义,然后继续在循环中为该值推入“n/a”,如下所示:

string.forEach(el => {
     if (obj[`${el}`] === undefined){
        nums.push('n/a')
     } else{
        nums.push(obj[`${el}`])
     }

现在,您的nums数组将如下所示:[1,2,'n/a',4,5]

我会这样做:

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 => {
     if (obj[`${el}`] === undefined){
        nums.push('n/a')
     } else{
        nums.push(obj[`${el}`])
     }
  })

nums.forEach(el => {
   if(el > 9){
        thelast.push("n/a") 
   }else{
        sum += el
   }
 })


if (nums.includes('n/a')){
    return 'n/a'
} else{
    var final = Math.floor(sum / nums.length);
    return final
}

}