2012-03-15 26 views
5

Tôi đang giải quyết các kata sau đây: Viết một chương trình làm đối số đầu tiên của một trong các từ 'tổng,' 'sản phẩm,' 'có nghĩa là' hoặc 'sqrt' và để tranh luận thêm một loạt các số. Chương trình áp dụng hàm thích hợp cho chuỗi.JavaScript (Sơ cấp) Kata - Xây dựng một Máy tính Sử dụng Chức năng

Tôi đã giải quyết nó (mã bên dưới) nhưng nó cồng kềnh và không hiệu quả. Tôi đang tìm cách viết lại nó có một chức năng duy nhất máy tính gọi các chức năng khác (tức là tổng số, chức năng sản phẩm).

Câu hỏi của tôi: làm cách nào để viết các hàm tổng, sản phẩm, sqrt, v.v. do đó khi được máy tính hàm gọi, chúng đúng cách lấy các đối số của máy tính và tính toán.

Dưới đây là mã cồng kềnh:

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

Đây có phải là bài tập về nhà không? Nếu có, vui lòng gắn thẻ như vậy. – j08691

+2

Không phải vậy. Tôi mới lập trình và JS. Tôi bắt đầu w/Codecademy, nhưng tôi đang cố gắng tìm cách để cải thiện. Tôi tìm thấy liên kết đến các Katas khác nhau và chỉ đơn giản là đi qua chúng để cố gắng cải thiện: http://www.knowing.net/index.php/2006/06/16/15-exercises-to-know-a-programming- language-part-1/ – mcranston18

Trả lời

7

Bạn chỉ có thể tạo một đối tượng với các chức năng bạn cần, nd sau đó có chức năng máy tính gọi đúng.

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.

Nếu bạn không hoàn toàn hiểu những gì tôi đang làm trong mã của mình, tôi khuyên bạn nên đọc khoảng call and apply in Javascript và cũng về khoảng objects in Javascript.

+0

Cảm ơn sự giúp đỡ của bạn Peter. Tôi đã mở liên kết gọi và áp dụng và hiện đang xem qua bài viết. – mcranston18

2

Bạn có thể vượt qua toàn bộ danh sách đối số của bạn để chức năng khác bằng cách sử dụng apply() phương pháp:

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

Với hoạt động của bạn trong các phương pháp riêng biệt:

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

'arguments.slice (1, argument.length)' không hoạt động vì 'arguments' không thực sự là một mảng và không có phương thức' slice' trong nguyên mẫu của nó. –

+0

Cảm ơn Peter, tôi sẽ thay đổi nhưng câu trả lời của bạn tốt hơn tôi nhiều. – Jivings

Các vấn đề liên quan