【问题标题】:Function and if else statement not working函数和 if else 语句不起作用
【发布时间】:2017-07-23 12:23:52
【问题描述】:

我只是在学习如何编码,我现在正在使用 CodeWars 练习基础知识。由于 CodeWars 允许您查看解决方案,因此我查看了一些解决方案以寻求指导,这很有帮助。我已使用此站点作为指导,但无法弄清楚为什么我的功能不起作用。它是用 javascript 编写的。它只输出 []。这是问题、代码和输出(按以下顺序):

问题

编写一个方法,它将获取一个整数数组作为参数,并处理该数组中的每个数字。 返回一个新数组,处理输入数组的每个数字,如下所示: 如果数字有整数平方根,则取这个,否则取平方。 [4,3,9,7,2,1] -> [2,9,3,49,4,1]

代码

function squareOrSquareRoot(array) {

    var newValues = []; // new array for new values

    for (i = 0; i < array.length; i++){ // for loop to look through the values

        var initial = array[i]; // extracting one value from the array to evaluate
        var sqrt = Math.sqrt(initial); // finding the square root of initial
        if (Number.isInteger(sqrt) == 'true'){ // determining if sqrt is an integer 
                                            // and if so .....
            newValues.push[sqrt];
        } // .... adding sqrt to the newValues array
        else if (Number.isInteger(sqrt) == 'false') { // determining if sqrt is not 
                                                      // an integer
            newValues.push[initial*initial];  // then multiplying initial by itself 
                                           //and adding to newValues
        }
    }
    return newArray; // returning newValues onto the screen
}

输出

Expected: '[2, 9, 3, 49, 4, 1]', instead got: '[]'

Expected: '[10, 10201, 25, 25, 1, 1]', instead got: '[]'

Expected: '[1, 4, 9, 2, 25, 36]', instead got: '[]'

【问题讨论】:

  • 如果答案解决了问题,请接受答案,如果您需要更多帮助,请发表评论,以便我们为您提供帮助。
  • 你必须严格使用for循环吗?如果不查看我的答案,它实际上就是您需要的一切。它使用Array.map 函数,在这种情况下,IMO 是一个更好的选择
  • 我不必使用 for 循环,但我只学习了 4 周,想学习更好地使用 for 循环。顺便说一句,我真的很喜欢你的简单回答。我希望有一天能写出这样的代码。

标签: javascript arrays function loops


【解决方案1】:

你的情况有问题。改变

Number.isInteger(sqrt) == 'true'

Number.isInteger(sqrt) == true

Number.isInteger 返回布尔值而不是字符串。第二个 else if 也是多余的,如果 isInteger 返回 false 则只需执行 else 部分而不是再次检查。 最后你需要返回newValues 而不是newArray。希望对您有所帮助。

【讨论】:

  • 其实不需要'== true'。
  • 是的,同意,但我个人发现,当这样明确地写出代码时,代码变得更容易维护和发现错误,但它的可读性和维护偏好。
【解决方案2】:

你做错了很多事情。

  1. 您没有返回正确的数组。您应该返回 newValues 而不是 newArray
  2. 您不应在truefalse 中使用引号
  3. 不需要使用 if/else if 来判断 true/false。改用 if/else

这是可行的解决方案:

function squareOrSquareRoot(array) {

    var newValues = []; 
    for(var i = 0 ; i<array.length ;i++) {
        Number.isInteger(Math.sqrt(array[i]))?newValues.push(Math.sqrt(array[i])):newValues.push(array[i]*array[i]);
    }
    return newValues;
}

var a = [3,4,5,9,7,16,36,11];
console.log('Input : ' + a);
console.log('Output: ' + squareOrSquareRoot(a));

输入:[3,4,5,9,7,16,36,11]

输出:[9,2,25,3,49,4,6,121]

如果这个三元表达式让你感到困惑,这里是 if/else 语句的示例:

function squareOrSquareRoot(array) {

    var newValues = []; 
    for(var i = 0 ; i<array.length ;i++) {
        var initial = array[i];
        var sqrt = Math.sqrt(initial);
        if(Number.isInteger(sqrt)) 
            newValues.push(sqrt);
        else
            newValues.push(array[i]*array[i]);
    }
    return newValues;
}

var a = [3,4,5,9,7,16,36,11];
console.log('Input : ' + a);
console.log('Output: ' + squareOrSquareRoot(a));

【讨论】:

  • 将所有内容放在一行中并不能使您的代码更好、更快、更具可读性。人类可读性是代码的主要问题。
  • @webdeb 更好吗? :)
  • 感谢您的帮助。我现在正在浏览你的代码。它使用条件三元运算符,直到您的回答和 webdeb 的回答我才知道。
  • 非常感谢没有三元表达式的回复。 1. 你为什么这样做? newValues.push(array[i]);我想将平方根值 (var sqrt) 添加到 newValues 数组。 2. 你为什么这样做? newValues.push(array[i]*array[i]);我应该删除 var initial 吗?是这样,为什么?
  • @thisOne 是的,逻辑与您正在寻找的不同,我已经提交了一个编辑,应该更新它的审查。
【解决方案3】:

最好不要使用 for 循环,而是完全适用 array.map

  function squareOrSquareRoot(array) {
    return array.map(function(int) {
      var sqrt = Math.sqrt(int);
      return Number.isInteger(sqrt) ? sqrt : int * int;
    })
  }

Array.map 将每个项目映射到给定的函数,并在最后返回一个新数组。

【讨论】:

  • @Scimonster 不是,但在这种情况下,Array.map 是一个更好、更简单的解决方案。因为您想遍历所有项目并仅基于给定的项目返回一个输出数组..
  • @webdeb '我只是在学习如何编码,我现在正在研究基础' - OP。为什么你认为他会理解映射或三元表达式?
  • 是的,我不明白映射或最后一行。但我喜欢它的简单性。
  • @thisOne 它简单干净,但先学习基础知识,稍后您将进入映射和所有内容。祝你好运
  • @webdeb 返回也不好,你应该返回 sqrt : int*int 作为上面提到的OP。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多