【问题标题】:JavaScript (Beginner-Level) Kata - Building a Calculator Using FunctionsJavaScript(初级)Kata - 使用函数构建计算器
【发布时间】:2012-03-15 23:56:50
【问题描述】:

我正在解决以下 kata:编写一个程序,将单词“sum”、“product”、“mean”或“sqrt”中的一个作为其第一个参数,并为进一步的参数提供一系列数字。程序将适当的函数应用于系列。

我已经解决了(代码如下),但它体积庞大且效率低下。我希望重写它,它有一个调用其他函数(即函数 sum、函数 product)的单个函数 calculator

我的问题:如何编写函数 sum、product、sqrt 等,以便在函数计算器调用时,它们正确地获取计算器的参数并计算数学。

下面是庞大的代码:

function calculator() {

    var sumTotal = 0;
    var productTotal = 1;
    var meanTotal = 0;
    var sqrt;

    if(arguments[0] === "sum") {
        for(i = 1; i < arguments.length; i++) {
            sumTotal += arguments[i];
        }
    return sumTotal;
    }

    if(arguments[0] === "product") {
        for(i = 1; i < arguments.length; i++) {
            productTotal *= arguments[i];
        }
    return productTotal;
    }

    if(arguments[0] === "mean") {
        for(i = 1; i < arguments.length; i++) {
            meanTotal += arguments[i];
        }
    return meanTotal / (arguments.length-1);
    }

    if(arguments[0] === "sqrt") {
            sqrt = Math.sqrt(arguments[1]);
        }
    return sqrt;

}


calculator("sqrt", 17);

【问题讨论】:

  • 这是作业吗?如果是这样,请标记它。
  • 不,不是。我是编程和 JS 的新手。我从 Codecademy 开始,但正在努力寻找改进的方法。我找到了各种 Katas 的链接,我只是通过它们来尝试改进:knowing.net/index.php/2006/06/16/…

标签: javascript


【解决方案1】:

你可以只用你需要的函数创建一个对象,然后让计算器函数调用正确的函数。

var operations = {
  sum: function() { /* sum function */ },
  product: function() { /* product function */ },
  mean: function() { /* mean function */ },
  sqrt: function() { /* sqrt function */ }
};

function calculator(operation) {
  operation = operations[operation];
  var args = Array.prototype.slice.call(arguments, 1);
  return operation.apply(this, args);
}

You can see an example of this in action on jsFiddle.

如果您不太了解我在代码中所做的工作,我建议您阅读有关 call and apply in Javascriptobjects in Javascript 的内容。

【讨论】:

  • 感谢您的帮助彼得。我已经打开了呼叫和申请链接,现在正在阅读这篇文章。
【解决方案2】:

您可以使用apply() 方法将整个参数列表传递给另一个函数:

if(arguments[0] === "sum") {
   return sum.apply(this, Array.prototype.slice.call(arguments, 1));
}

在不同的方法中进行操作:

function sum() {
  var sumTotal = 0;
  for(i = 1; i < arguments.length; i++) {
            sumTotal += arguments[i];
  }
  return sumTotal;
}

【讨论】:

  • arguments.slice(1, arguments.length) 不起作用,因为arguments 实际上不是一个数组,并且其原型中没有slice 方法。
  • 谢谢彼得,我会做出改变,但无论如何你的回答比我的要好得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多