简体   繁体   中英

Trying to workout how to deal with an array

I'm in the process of teaching myself javascript and it looks at though I've hit a road block. As an exercise I am trying to build a tax calculator.

Here is an object I built that contains the tax brackets:

var taxBracket = [
{bracket: 1, from:0, to:18200, percentage :0, amount:0},
{bracket: 2, from:18201, to:37000, percentage :19, over:18200, amount:0},
{bracket: 3, from:37001, to:80000, percentage :32.5, over:37000, amount:3752},
{bracket: 4, from:80001, to:180000, percentage :37, over:80000, amount:17547},
{bracket: 5, from:180001, to:0, percentage :45, over:180000, amount:54547}];

and here is the function that loops through object to find the corresponding tax bracket of y

function returnTax (y){
    for(var x in taxBracket){
    if (y >= taxBracket[x].from && y <= taxBracket[x].to){
        var z = taxBracket[x].amount + ((grossIncome-taxBracket[x].over) * (taxBracket[x].percentage/100));
        return z;   
    }
};

The issue is that if y is over 180000, it errors out as to is 0. Is this only solution to this an else statement repeating the functions of the if statement? Thank for your help!

Good job with it so far. Simply using Infinity instead of defaulting to 0 on the final bracket will fix it. I've made a couple of recommendations on your syntax as well, hope it helps.

var taxBracket = [
    {bracket: 1, from: 0, to: 18200, percentage: 0, amount: 0},
    {bracket: 2, from: 18201, to: 37000, percentage: 19, over: 18200, amount: 0},
    {bracket: 3, from: 37001, to: 80000, percentage: 32.5, over: 37000, amount: 3752},
    {bracket: 4, from: 80001, to: 180000, percentage: 37, over: 80000, amount: 17547},

    // Use Infinity instead of 0 for the "to" value of bracket 5
    {bracket: 5, from: 180001, to: Infinity, percentage: 45, over: 180000, amount: 54547}
];

// Variable names like 'x', 'y' and 'z' can cause problems with code readability.
// Descriptive names such as "income", or even "string" or "int" will help you out when you come to review your code later!
function returnTax(y){

    // Using for..in with arrays can cause issues with enumerating over object properties.
    // You don't have to worry about it in this case, but a standard for loop (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for) is better practice.
    for(var x = 0; x < taxBracket.length; x++){

        if(y <= taxBracket[x].to){

            // I find breaking up long calculations into separate variables can make it
            // more readable. More preference than anything else though!
            var amountOver = grossIncome - taxBracket[x].over;
            var percent = taxBracket[x].percentage / 100;
            return taxBracket[x].amount + (amountOver * percent);

        }

    }

}

You are creating an array literal of object literals. You should loop through arrays with a standard for loop.

一种解决方案是使最后一个“ to”字段的数量非常大。

you can use built in function to loop array of object like

yourArray.forEach
( function (arrayItem)
{
var x =
arrayItem.prop1 + 2;
alert(x);
 });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM