简体   繁体   中英

How do I return a variable from nested For Loops in JavaScript without using a global variable?

Here is my code sans input

// Check if three addends equal sum and return the product if so
let result;
function addNumbers(first,second,third,sum) {
    if (first + second + third === sum) {
        result = first * second * third;
        return (first * second * third);
    }
};

// find three numbers in list that add up to specific number
function testResult(list,sum) {
    let firstAddend;
    let secondAddend;
    let thirdAddend;
    for (let i = 0; i < list.length; i++) {
        firstAddend = list.shift();
        for (let j = 0; j < list.length; j++) {
            secondAddend = list[j];
            for (let k = 1; k < list.length; k++) {
                thirdAddend = list[k];
                addNumbers(firstAddend,secondAddend,thirdAddend,sum);
            }
        }
    }
};

What I want is testResult() to return the result from addNumbers() when it returns the product. I want to get rid of let result; and result =... in addNumbers() . I've been confused about scope but I think I'm starting to understand. Does each for loop contain the scope of the previous? If anyone is interested this is from Advent of Code Day 1. I am not certain if having the data is necessary here. If it is let me know and I will edit accordingly.

Does each for loop contain the scope of the previous?

Yes, it does. Whenever you create a sub-scope, all the variables in the previous scope are available. So, you don't actually have to declare firstAddend and secondAddend and thirdAddend ahead of time:

function testResult(list,sum) {
    for (let i = 0; i < list.length; i++) {
        let firstAddend = list.shift();
        for (let j = 0; j < list.length; j++) {
            let secondAddend = list[j];
            for (let k = 1; k < list.length; k++) {
                let thirdAddend = list[k];
                addNumbers(firstAddend,secondAddend,thirdAddend,sum);
            }
        }
    }
}

Next, the return means that when you call the function, it takes on the value that you return. So, you don't need a global result variable, as you can just utilize the return value. However, you should move the if statement out of the addNumbers function and into the testResult function, as you need to know when to return, not just what to return. In fact, the addNumbers function is simply enough to where it should just go directly into testResult :

function testResult(list,sum) {
    for (let i = 0; i < list.length; i++) {
        let firstAddend = list.shift();
        for (let j = 0; j < list.length; j++) {
            let secondAddend = list[j];
            for (let k = 1; k < list.length; k++) {
                let thirdAddend = list[k];
                if (firstAddend + secondAddend + thirdAddend === sum) {
                    return firstAddend * secondAddend * thirdAddend;
                }
            }
        }
    }
}

For practice, if you want the function, you could do something like the following:

function addNumbers(first,second,third,sum) {
    if (first + second + third === sum) {
        return (first * second * third);
    } else {
        return null; // return some value so the calling function knows that no sum was found
    }
}

function testResult(list,sum) {
    for (let i = 0; i < list.length; i++) {
        let firstAddend = list.shift();
        for (let j = 0; j < list.length; j++) {
            let secondAddend = list[j];
            for (let k = 1; k < list.length; k++) {
                let thirdAddend = list[k];
                let result = addNumbers(firstAddend, secondAddend, thirdAddend, sum);
                if (result !== null) {
                    return result;
                }
            }
        }
    }
}

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