kjarsenal
kjarsenal

Reputation: 934

proper use of the array.push method

if I have a simple test function that adds even numbers to an array:

function isEven(n){
    var enumbers = [];
    if (n % 2 == 0){
        enumbers.push (n);
    }
}

how can I increment my parameter until I have a set number of members in my array? for instance, I've tried this:

function isEven(n){
    var enumbers = [];
    while ( enumbers.length < 10){
    if (n % 2 == 0){
        enumbers.push (n);
    }
    console.log (enumbers);
             n = n + 1;
    isEven(n);
    }
}
isEven(1);

but it seems to just create a new array for each number until it finally throws a range error (maximum call stack size exceeded).

Upvotes: 0

Views: 209

Answers (5)

Vitim.us
Vitim.us

Reputation: 22138

I'm not sure if I understood your question. But you shouldn't use global variables, and it is unnecessary to call your function recursively inside a while loop.

The error maximum call stack size exceeded is your browser trying to break a infinity loop.

This is what you need.

Examples here jsFiddle1 and jsFiddle2

function isEven(n) {
    var enumbers = [];

    while (enumbers.length < 10) {
        if (n % 2 == 0) {
            enumbers.push(n);
        }
        n++;
    }
    return enumbers;
}

Setup a test

var n = 1;
var evenArray = isEven(n); //call isEven function and it returns an array

document.body.innerHTML = evenArray; //2,4,6,8,10,12,14,16,18,20

Upvotes: 0

face
face

Reputation: 1505

I would have written something like:

function isEven(n,enumbers){  
    while(enumbers < 10){  
        if (n % 2 == 0){  
             enumbers.push (n);  
        }
        console.log (enumbers);  
        n = n + 1;  
        isEven(n, enumbers);  
    }  
}  
var enumbers = [];  
isEven(1,enumbers);

Upvotes: -1

dev2d
dev2d

Reputation: 4262

I suggest you create the array outside of is even method

Upvotes: 0

tymeJV
tymeJV

Reputation: 104775

It's creating that array multiple times because you're constantly calling that function with:

isEven(n);

You're also not comparing to the length of the array, just the array. Add .length to enumbers. Try changing to:

var enumbers = [];
while ( enumbers.length < 10){
    if (n % 2 == 0){
        enumbers.push (n);
    }
    console.log (enumbers);
}

Upvotes: 2

GolezTrol
GolezTrol

Reputation: 116110

The problem is that (enumber < 10) apparently always evaluates to true, causing an endless loop. But it is this comparison that is wrong, since you're comparing an integer with an array I think you're trying to get the array length?:

while (enumbers.length < 10) {

Another thing. enumbers is a local variable, so each call to isEven has it's own array. Therefore, the functions is called recursively, over and over again.

Upvotes: 0

Related Questions