Dominic
Dominic

Reputation: 727

I'm only able to return 1 array

I'm trying to take this array and split it into 2 new arrays, evens and odds and return them. When I run the code below I am only getting the odds, why is that? And what can I do to solve it?

Thanks in advance.

var numbersArray = [1,2,34,54,55,34,32,11,19,17,54,66,13];

function divider( arr ) {
  var evens = [];
  var odds = [];
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] % 2 === 0) {
      evens.push(arr[i]);
    } else {
      odds.push(arr[i]);
    }
  }
  return(evens, odds);
}

divider(numbersArray);

Upvotes: 4

Views: 104

Answers (7)

skypjack
skypjack

Reputation: 50540

The result of evaluating (evens, odds) is odds, that is returned thus.
This is how comma operator works.

Use the following statement instead:

return { 'evens': evens, 'odds': odds };

As an example:

var v = divider(numberArrays);
v.evens; // get evens this way
v.odds; // get odds this way

Upvotes: 2

user2864740
user2864740

Reputation: 61865

Because JavaScript can only return one value. Ever.

return(evens, odds)

evaluates to the same value as

return odds

due to the comma operator wrapped in grouping parenthesis.

Perhaps returning an array of arrays (or even an object of arrays) is useful..

return [evens, odds]

Upvotes: 11

Pedro Costa Neves
Pedro Costa Neves

Reputation: 463

You could return an object, like this:

var numbersArray = [1,2,34,54,55,34,32,11,19,17,54,66,13];

function divider( arr ) {
    var evens = [];
    var odds = [];
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] % 2 === 0) {
            evens.push(arr[i]);
        } else {
            odds.push(arr[i]);
        }
    }
    return {evens, odds};
}

divider(numbersArray);

Upvotes: 1

jstuartmilne
jstuartmilne

Reputation: 4488

Es5 doesn't support tuples, You should wrap your return

in an object like here

 var numbersArray = [1,2,34,54,55,34,32,11,19,17,54,66,13];

    function divider( arr ) {
      var evens = [];
      var odds = [];
      for (var i = 0; i < arr.length; i++) {
        if (arr[i] % 2 === 0) {
          evens.push(arr[i]);
        } else {
          odds.push(arr[i]);
        }
      }
      return {evens:evens, 
    odds:odds};
    }

   divider(numbersArray);

Or in an array as the other aswers show

Upvotes: 1

boehm_s
boehm_s

Reputation: 5534

In Javascript, you can only return ONE value. So, if you want to return multiples values, to separate them, you can put them in an array or in an object :

 return([evens, odds]);

OR

return({evens: evens, odds: odds})

Upvotes: 2

user212514
user212514

Reputation: 3130

You should return your results as an array.

return [evens, odds];

And then to access the results:

var evens;
var odds;

var arrayResults = divider(numbersArray);
evens = arrayResults[0];
odds = arrayResults[1];
console.log(evens);
console.log(odds);

Upvotes: 2

rishabh dev
rishabh dev

Reputation: 1743

You can return only one entity from a function. Its better to wrap your results in single object.

  var numbersArray = [1,2,34,54,55,34,32,11,19,17,54,66,13];

    function divider( arr ) {
      var evens = [];
      var odds = [];
      for (var i = 0; i < arr.length; i++) {
        if (arr[i] % 2 === 0) {
          evens.push(arr[i]);
        } else {
          odds.push(arr[i]);
        }
      }
      return {evens:evens, odds:odds};
    }

    divider(numbersArray);

Upvotes: 1

Related Questions