George Edwards
George Edwards

Reputation: 9229

Looping through two (different lengthed) arrays to produce an alternating output

What is an efficient way of looping through two arrays to produce an alternating output? In JavaScript.

If I have two arrays like this:

var oddNumbers = [1, 3, 5, 7, 9]
var evenNumbers = [2, 4, 6, 8, 10, 12, 14]

NB: The arrays may not be the same length

How can I get the following output?

Output: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14

I would have thought this would work:

if (oddNumber.length > evenNumbers.length) {
    var large = oddNumbers;
} else {
    var large = evenNumbers;
}
for(var i = 0; i < large.length; i++){
    if (evenNumbers.length >= i && oddNumbers.length >= i) {
        console.log(oddNumbers[i] + ", " + evenNumbers[0]);
    } elseif (evenNumbers.length >= i) {
        console.log(evenNumbers[0]);
    } else {
        console.log(oddNumbers[0]);
    }
}

But it's pretty messy, any better way of approaching this?

NOTE: These may not necessarily be in a numerical order, or in fact numbers

Upvotes: 4

Views: 1199

Answers (9)

rvisharma
rvisharma

Reputation: 36

My solution

var oddNumbers = [1, 3, 5, 7, 9]
var evenNumbers = [2, 4, 6, 8, 10, 12, 14]
var extraElements = (oddNumbers.length > evenNumbers.length) ? oddNumbers.slice(evenNumbers.length) : evenNumbers.slice(oddNumbers.length);
var finalArr = [];
var small = (oddNumbers.length < evenNumbers.length) ? oddNumbers : evenNumbers;
small.forEach((each, index) => {
  // merge elements in desired order
  finalArr.push(oddNumbers[index]);
  finalArr.push(evenNumbers[index]);
})
finalArr = finalArr.concat(extraElements);
alert(finalArr);
Extract the extra elements which makes both array of same length. Then, in a simple iteration, push elements from both array with same index.

Upvotes: 0

Darragh Enright
Darragh Enright

Reputation: 14136

The following function accepts two arrays and returns their interleaved values as a new array:

function interleaveArrays(a, b) {

  var array = [],
      limit = a.length >= b.length ? a.length : b.length;
      index = 0;

  while (index < limit) {
    a[index] && array.push(a[index]);
    b[index] && array.push(b[index]);
    index += 1;
  }

  return array;
}

Calling the function like so:

var oddNumbers  = [1, 3, 5, 7, 9],
    evenNumbers = [2, 4, 6, 8, 10, 12, 14];

console.log(interleaveArrays(oddNumbers, evenNumbers));

Yields:

[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14 ]

You can then output this in your preferred manner; e.g:

var interleaved = interleaveArrays(oddNumbers, evenNumbers);

// as a loop
interleaved.forEach(function (n) {
  console.log(n);
})

// or as a string
console.log(interleaved.join(', ')); 

// etc.

Hope this helps :)

Upvotes: 1

Abhishek Mishra
Abhishek Mishra

Reputation: 31

try this it will work always either number Array or String Array:

var oddNumber = [1, 3, 5, 7, 9]
var evenNumber = [2, 4, 6, 8, 10, 12, 14]
var margedNumbers = oddNumber.concat(evenNumber);
console.log("before: "+margedNumbers);
margedNumbers.sort(function(a, b){return a-b})
console.log("after: "+margedNumbers)

Upvotes: 0

Ganesh Karewad
Ganesh Karewad

Reputation: 1218

There will be an extra , on the screen. Add an if statement if you don't want that

 for(var i = 0; i < large.length; i++){
 if(i<evenNumbers.length)
    console.log(evenNumbers[i]+","); 
 if(i<oddNumber.length)
   console.log(evenNumbers[i]+","); 
}

Upvotes: 0

Vladu Ionut
Vladu Ionut

Reputation: 8193

var oddNumbers = [1, 3, 5, 7, 9];
var evenNumbers = [2, 4, 6, 8, 10, 12, 14];

var oLength = oddNumbers.length;
var eLength = evenNumbers.length;
var n = oLength > eLength ? oLength : eLength;
var rez=[];


for(i=0;i<n;i++){
 if (i< oLength) rez.push(oddNumbers[i])
 if (i<eLength)  rez.push(evenNumbers[i])
}
console.log(rez);


var odd = ["A", "C","E","G"];
var even = ["B","D","F"];
var rez=[];
for(i=0;i<(odd.length > even.length ? odd.length : even.length);i++){
 if (i< odd.length) rez.push(odd[i])
 if (i<even.length)  rez.push(even[i])
}
console.log(rez);

Upvotes: 1

jonju
jonju

Reputation: 2736

I would simply merge the two array and sort it

var oddNumbers = [1, 3, 5, 7, 9];
var evenNumbers = [2, 4, 6, 8, 10, 12, 14];
var mergedArr=oddNumbers.concat(evenNumbers );
console.log(mergedArr.sort(function(a,b){return a-b;}));

See No loop.. No hassle. Very Simple

Upvotes: 0

Fma
Fma

Reputation: 362

I would rather do it as follows if you just want to output them:

var oddNumbers = [1, 3, 5, 7, 9];
var evenNumbers = [2, 4, 6, 8, 10, 12, 14];
for (var i=0, j=0; i < oddNumbers.length || j < evenNumbers.length;) {
  if (i < oddNumbers.length) {
    console.log(oddNumbers[i++]);
  }
  if (j < evenNumbers.length) {
    console.log(evenNumbers[j++]);
  }
}

If you want to get the merge result as another array you can replace console.log with result.push to push result values on an array named result as follows:

var oddNumbers = [1, 3, 5, 7, 9];
var evenNumbers = [2, 4, 6, 8, 10, 12, 14];
var result = [];
for (var i=0, j=0; i < oddNumbers.length || j < evenNumbers.length;) {
  if (i < oddNumbers.length) {
    result.push(oddNumbers[i++]);
  }
  if (j < evenNumbers.length) {
    result.push(evenNumbers[j++]);
  }
}
console.log(result);

This way you iterate both arrays as long as one of them has an element that we haven't visited yet and also prevents iterating over the same index of same array twice. Please note that I used increment in if blocks to save 2 lines of code. You can also move them to the for loop since they won't break if statements.

Upvotes: 1

Rian O&#39;Dwyer
Rian O&#39;Dwyer

Reputation: 435

A long-hand example of how it can be done. The code can be shrunk for a final solution. The basic principle I'm using is to even out the lengths to take care of the alternating then tag on the tail

var oddNumbers = [1, 3, 5, 7, 9];
var evenNumbers = [2, 4, 6, 8, 10, 12, 14];

var oLength = oddNumbers.length;
var eLength = evenNumbers.length;

var oTemp, eTemp, remainder;

if(oLength > eLength) {
  eTemp = evenNumbers;
  oTemp = oddNumbers.slice(0, eLength);
  remainder = oddNumbers.slice(eLength);
} else if (eLength > oLength) {
  eTemp = evenNumbers.slice(0, oLength);
  oTemp = oddNumbers;
  remainder = evenNumbers.slice(oLength);
} else {
  eTemp = evenNumbers;
  oTemp = oddNumbers;
  remainder = [];
}

var final = [];

for(var i=0; i < eTemp.length; i++) {
  final.push(oTemp[i]);
  final.push(eTemp[i]);
}

final = final.concat(remainder);

alert(final);

Upvotes: 0

Mridul Kashyap
Mridul Kashyap

Reputation: 700

I'd do something like this.

large = (oddNumber.length >= evenNumbers.length) ? oddNumbers : evenNumbers;
small = (oddNumber.length < evenNumbers.length) ? oddNumbers : evenNumbers;

for(var i = 0; i < large.length; i++){
    if(small.length <= i + 1){
        console.log(small[i] + ", "+ large[i]);
    }
    else {
        console.log(large[i]);
    }
}

Upvotes: 0

Related Questions