2012-03-15 15 views
5

Estoy solucionando el siguiente kata: Escriba un programa que tome como primer argumento una de las palabras 'suma', 'producto', 'medio' o 'sqrt' y para argumentos adicionales una serie de números. El programa aplica la función apropiada a la serie.JavaScript (nivel principiante) Kata - Creando una calculadora usando funciones

Lo he resuelto (código a continuación) pero es voluminoso e ineficiente. Estoy buscando volver a escribirlo tiene una sola función calculadora que llama a las otras funciones (es decir, la función suma, función producto).

Mi pregunta: ¿cómo escribo las funciones suma, producto, sqrt, etc. por lo que cuando se llama por la función calculadora, toman los argumentos de la calculadora y calculan las matemáticas correctamente.

A continuación se muestra el código voluminosos:

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); 
+0

¿Es esta tarea? Si es así, márquelo como tal. – j08691

+2

No, no lo es. Soy nuevo en programación y JS. Empecé con Codecademy, pero estoy tratando de encontrar formas de mejorar. Encontré el enlace a varios Katas y simplemente los sigo para tratar de mejorar: http://www.knowing.net/index.php/2006/06/16/15-exercises-to-know-a-programming- language-part-1/ – mcranston18

Respuesta

7

Puede simplemente crear un objeto con las funciones que necesita, un Entonces, haga que la función calculadora llame a la correcta.

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.

Si no entiende muy bien lo que estoy haciendo en mi código, recomiendo leer acerca de call and apply in Javascript y también acerca de objects in Javascript.

+0

Gracias por su ayuda Peter. Tengo el enlace de llamar y aplicar abierto y estoy repasando el artículo ahora. – mcranston18

2

Puede pasar toda su lista de argumentos a otra función utilizando el apply() método:

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

Con sus operaciones en métodos distintos:

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

'arguments.slice (1, arguments.length)' no funciona porque 'arguments' no es realmente una matriz y no tiene el método' slice' en su prototipo. –

+0

Gracias Peter, voy a hacer un cambio, pero tu respuesta es mucho mejor que la mía de todos modos. – Jivings

Cuestiones relacionadas