Noah Clark
Noah Clark

Reputation: 8131

Javascript Array.push method issue

I have the following code:

function build_all_combinations(input_array){
   array = [1,2,3]
   limit = array.length - 1
   combo = []

   for(i = 0; i<= limit; i++){
      splice_value = array.splice(0,1)
      push_value = splice_value[0]
      array.push(push_value)
      console.log(array) 
      combo.push(array) 
   }
   console.log(combo) 
}

Which outputs:

[2, 3, 1]
[3, 1, 2]
[1, 2, 3]
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]

The last line should be: [[2, 3, 1],[3, 1, 2],[1, 2, 3]]

I'm obviously not grokking something about the way the array is working. Each individual array is correct, but when I go to push them to the combo array, something is failing along the way. What is it?

Upvotes: 1

Views: 252

Answers (3)

Jashwant
Jashwant

Reputation: 28995

jordan002 has given the explanation for this behaviour.

Here's the workaround.

array = [1,2,3]
limit = array.length - 1
combo = []
for(i = 0; i<= limit; i++){
 splice_value = array.splice(0,1)
 push_value = splice_value[0];
 array.push(push_value);
 console.log(array);
 combo.push(array.concat([]));
}
console.log(combo);  

You can store a copy in temp variable.

array = [1,2,3]
limit = array.length - 1
combo = []
for(i = 0; i<= limit; i++){
 splice_value = array.splice(0,1)
 push_value = splice_value[0];
 array.push(push_value);
 console.log(array);
 var temp = array.slice();  
 combo.push(temp);
}
console.log(combo) 

Reference

Upvotes: 2

jackwanders
jackwanders

Reputation: 16020

shift and slice are your friends here:

var array = [1,2,3];
var combo = []
for(var i = 0; i<array.length; i++){
  array.push(array.shift());  // remove first element (shift) and add it to the end (push)
  combo.push(array.slice());  // add a copy of the current array to combo
}

DEMO

Upvotes: 3

Peter Bratton
Peter Bratton

Reputation: 6408

Each time you are pushing the same array into the combo array; ie, all the references are pointing to the same instance in memory. So when you update one, you've in reality updated them all.

If you want separate references, you'll need to create separate arrays.

Upvotes: 5

Related Questions